CFCユーザーコンテンツハンドラーをアプリケーションスコープに保存しても安全ですか?

第1巻

CFCをアプリケーションスコープに格納することに関する多くの投稿を読みましたが、CFCがデータを格納する場合、そのデータをアプリケーションスコープに含めるべきではないことを理解しています。実用的でないものを実行するすべてのCFCは、ユーザー名や電子メールアドレスなどのパラメーターを渡すとデータを保存するため、実用的でないcfcのアプリケーションスコープを使用するタイミングと使用しないタイミングがわかりません。

私の質問はposthandler.cfc、ユーザーからの投稿を処理する約500行のコードのコンポーネントがあることです(SOがこのサイトに投稿された各質問を処理するのと同じように)。posthandler.cfcコンポーネント:

  • ユーザーが送信した画像やテキストを「クリーンアップ」します
  • 画像を正しいフォルダに配置します
  • すべてのテキストをデータベースに書き込みます
  • 投稿を表示できるURLを返します

返されたURLは、ユーザーをURLにリダイレクトする単純なJqueryajax呼び出しによって受信されます。

これはサイトで非常に定期的に発生し、現在、投稿ごとに新しいCFCインスタンスが作成されています。代わりにアプリケーションスコープに入れて、レース/ロック状態を引き起こさないのは安全ですか?

SOS

パラメータを渡すだけでは、何も「保存」されません。概念的に、各スレッドはそれ自身の持つargumentslocal他のスレッドには見えないである、スコープを、そして場合関数が終了存在しなくなります。したがって、その観点からは、競合はありません。

また、データを保存することは、データをデータベーステーブルに保存することを意味するものではありません。共有スコープ/オブジェクトなどにデータを格納することで状態を維持するコンポーネントを指します。「共有」とは、リソースが他のスレッドからアクセス可能であることを意味し、複数のスレッドによって同時に変更される可能性があり、競合状態につながる可能性があります。 。

たとえば、variablesスコープ内の情報を「保存」するこの(考案された)コンポーネント関数を考えてみましょうそのコンポーネントの新しいインスタンスを毎回作成する場合、各リクエストは独自のインスタンスと、操作するvariablesスコープの個別のコピーを取得するため、関数は安全です。

 public numeric function doStuff( numeric num1, numeric num2 ) {
    variables.firstNum = arguments.num1 * 12;
    variables.secondNum = arguments.num2 * 10;

    return variables.firstNum / variables.secondNum;
 }

次に、同じコンポーネントを取得して、アプリケーションスコープに配置します。それはもはや安全ではありません。applicationスコープに格納するとすぐに、インスタンス(およびそのインスタンス)variablesもアプリケーションスコープになります。したがって、関数がデータをvariablesスコープに「保存」すると、基本的にapplication変数が更新されます。明らかに、これらはすべてのリクエストにアクセスできるため、スレッドセーフではありませんそのため、複数のスレッドが同じ変数を同時に簡単に読み取ったり変更したりして、競合状態を引き起こす可能性があります。

// "Essentially" becomes this .... 
public numeric function doStuff( numeric num1, numeric num2 ) {
    application.firstNum = arguments.num1 * 12;
    application.secondNum = arguments.num2 * 10;

    return application.firstNum / application.secondNum;
}

また、James A Mohlerが指摘したように、スコープを省略した場合にも同じ問題が発生します。スコープなしで関数変数を宣言しても、関数に対してローカルにはなりません。これにより、デフォルトのスコープの一部になります:-(variables上記と同じスレッドセーフの問題が発生します)。開発者が単一のクエリ変数またはループインデックスのスコープを忘れると、この動作により多くのスレッドバグが発生します。したがって、必ずすべての関数変数を明示的にスコープしてください。

 // Implicitly creates "variables.firstNum" and "variables.secondNum"
 public numeric function doStuff( numeric num1, numeric num2 ) {
    firstNum = arguments.num1 * 12;
    secondNum = arguments.num2 * 10;

    return firstNum / secondNum;
 }

ロックを追加する以外に、代わりにスコープを明示的に使用することで、両方の例をスレッドセーフにすることができますlocal一時的なlocalスコープにデータを格納することにより、データは他のスレッドからは見えなくなり、関数が終了すると存在しなくなります。

 public numeric function doStuff( numeric num1, numeric num2 ) {
    local.firstNum = arguments.num1 * 12;
    local.secondNum = arguments.num2 * 10;

    return local.firstNum / local.secondNum;
 }

明らかに、参照によって渡される複雑なオブジェクトや構造、およびそれらのオブジェクトが関数内で変更されるかどうかなど、考慮すべき他のケースがあります。しかし、うまくいけば、その小屋「セーブデータ」とどのようにスコープが状態の違いによって作ることができるもので何にいくつかの光以下の成分(のための安全applicationスコープ)と状態FUL部品(ありません)。

TL; DR;

あなたの場合、ほとんどの情報は共有されておらず、リクエストレベル(ユーザー情報、アップロードされた画像など)であるように思われるため、アプリケーションスコープに保存するのはおそらく安全です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

cfc はアプリケーション スコープで安全ですか

分類Dev

ユーザー入力用にアンパサンドをエスケープ解除しても安全ですか?

分類Dev

Xamain.AuthのさまざまなメソッドにAndroidアプリケーションコンテキストを使用しても安全ですか?

分類Dev

トランザクションレプリケーションサブスクライバーでDelayedDurabilityをオンにしても安全ですか?

分類Dev

'ハードコーディング'なしでアプリケーション/ゲームにテキストを保存する最良の方法は?

分類Dev

ユーザーが各ステップでドロップするjmeterを介してeコマースアプリケーションのリアルタイムトラフィックをシミュレートできますか?

分類Dev

ルートパスワードを追加し、起動時にMongoDBDockerコンテナにアプリケーションユーザーを作成します

分類Dev

シリアライザーでエスケープせずにhtmlコンテンツを返す方法は?

分類Dev

どこでもアプリケーションコンテキストを使用していますか?

分類Dev

ユーザー入力をエスケープするよりもSQLインジェクションで「パラメーター化されたクエリ/プリペアドステートメント」がどのように優れているか

分類Dev

アドレスバーを使用して、シングルページアプリケーションでユーザーをルーティングする

分類Dev

すべてのユーザーからターミナルでコマンドを使用してアプリケーションを実行する方法

分類Dev

ユーザーがユーザー名とパスワードのテキストボックスをクリアして送信を押した後でも、保存された資格情報を使用する ASP アプリケーション

分類Dev

Androidアプリケーションでは、テーブルごとに1つのコンテンツプロバイダーが必要ですか、それともアプリケーション全体に対して1つだけですか?

分類Dev

.Netコアコンソールアプリケーションがユーザーインタラクティブモードで実行されているかどうかを確認します

分類Dev

同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

分類Dev

同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

分類Dev

同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

分類Dev

このAngularアプリケーションが、ユーザーがログインした後に表示されるコンテンツを変更するユーザーステータス(ログイン/ログアウト)を処理できないのはなぜですか?

分類Dev

アプリケーション内でパスワードをハードコーディングすることの安全性は何ですか?

分類Dev

SpringBootアプリケーションのハイパーリンクにアプリケーションコンテキストパスを追加します

分類Dev

コンテンツをAndroidアプリケーションにライブストリーミングするにはどうすればよいですか?

分類Dev

クラスライブラリのソースコードを変更しても、アプリケーションに影響がないようです

分類Dev

別のユーザーのコマンドラインアプリケーションを自動化する

分類Dev

ユーザーコードサンドボックスにGoogleクラウド関数とパペッティアを使用しても安全ですか?

分類Dev

WPFはアプリケーションの起動時にtexboxコンテンツをロードします

分類Dev

Eclipseのコマンドハンドラーイベントからアプリケーションコンテキストを把握する方法

分類Dev

アプリケーション間でrabbitmqユーザーを共有するために保存しますか?

分類Dev

Restアプリケーションのユーザーコンテキスト

Related 関連記事

  1. 1

    cfc はアプリケーション スコープで安全ですか

  2. 2

    ユーザー入力用にアンパサンドをエスケープ解除しても安全ですか?

  3. 3

    Xamain.AuthのさまざまなメソッドにAndroidアプリケーションコンテキストを使用しても安全ですか?

  4. 4

    トランザクションレプリケーションサブスクライバーでDelayedDurabilityをオンにしても安全ですか?

  5. 5

    'ハードコーディング'なしでアプリケーション/ゲームにテキストを保存する最良の方法は?

  6. 6

    ユーザーが各ステップでドロップするjmeterを介してeコマースアプリケーションのリアルタイムトラフィックをシミュレートできますか?

  7. 7

    ルートパスワードを追加し、起動時にMongoDBDockerコンテナにアプリケーションユーザーを作成します

  8. 8

    シリアライザーでエスケープせずにhtmlコンテンツを返す方法は?

  9. 9

    どこでもアプリケーションコンテキストを使用していますか?

  10. 10

    ユーザー入力をエスケープするよりもSQLインジェクションで「パラメーター化されたクエリ/プリペアドステートメント」がどのように優れているか

  11. 11

    アドレスバーを使用して、シングルページアプリケーションでユーザーをルーティングする

  12. 12

    すべてのユーザーからターミナルでコマンドを使用してアプリケーションを実行する方法

  13. 13

    ユーザーがユーザー名とパスワードのテキストボックスをクリアして送信を押した後でも、保存された資格情報を使用する ASP アプリケーション

  14. 14

    Androidアプリケーションでは、テーブルごとに1つのコンテンツプロバイダーが必要ですか、それともアプリケーション全体に対して1つだけですか?

  15. 15

    .Netコアコンソールアプリケーションがユーザーインタラクティブモードで実行されているかどうかを確認します

  16. 16

    同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

  17. 17

    同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

  18. 18

    同じコード行でオプションでアクセスされた変数を強制的にアンラップしても安全ですか?

  19. 19

    このAngularアプリケーションが、ユーザーがログインした後に表示されるコンテンツを変更するユーザーステータス(ログイン/ログアウト)を処理できないのはなぜですか?

  20. 20

    アプリケーション内でパスワードをハードコーディングすることの安全性は何ですか?

  21. 21

    SpringBootアプリケーションのハイパーリンクにアプリケーションコンテキストパスを追加します

  22. 22

    コンテンツをAndroidアプリケーションにライブストリーミングするにはどうすればよいですか?

  23. 23

    クラスライブラリのソースコードを変更しても、アプリケーションに影響がないようです

  24. 24

    別のユーザーのコマンドラインアプリケーションを自動化する

  25. 25

    ユーザーコードサンドボックスにGoogleクラウド関数とパペッティアを使用しても安全ですか?

  26. 26

    WPFはアプリケーションの起動時にtexboxコンテンツをロードします

  27. 27

    Eclipseのコマンドハンドラーイベントからアプリケーションコンテキストを把握する方法

  28. 28

    アプリケーション間でrabbitmqユーザーを共有するために保存しますか?

  29. 29

    Restアプリケーションのユーザーコンテキスト

ホットタグ

アーカイブ