この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

コンポーネントの非同期コード

ハッカーは、非同期コードのタイミングを操作して、悪意のある結果を生じさせることができます。現在の実行コンテキストを保持するには、非同期関数コールをラップするか、または複数のアクションを単一の要求にまとめます。

setTimeout()setInterval() などの非同期関数を使用してコンポーネントを参照するときは、フレームワークのライフサイクルを終了します。非同期コードの実行中にユーザーインターフェースで他の場所に移動すると、フレームワークは、非同期要求を実行したコンポーネントを非表示にして破棄します。そのコンポーネントを引き続き参照できますが、コンポーネントは無効になっています。ハッカーは、この脆弱性を悪用して、アプリケーションをクラッシュさせるなどします。

フレームワークに安全に再入するには、$A.getCallback() 関数でコードをラップします。次に、コンポーネントが依然として有効であることを保証するため、コールバックで処理を実行する前に component.isValid() 関数を使用します。あるいは、enqueueAction() を使用して、複数のアクションを 1 つの要求にまとめます。

この脆弱性は、Summer ’17 リリース (API v40.0) 以降で作成されたコンポーネントには該当しません。

メモ

セキュリティ違反とその修正方法の例を次に示します。

Aura の例

setInterval() 関数は、ドキュメントオブジェクトモデル (DOM) へのアクセス権を付与します。しかし、Lightning フレームワークの外部のコンテキストで、setInterval() を使用した DOM へのアクセスが発生します。親コンポーネントの状態に関する保証はありません。この関数には親コンポーネントがない可能性があります。状態が変化した場合、コールバック関数は、所有していないデータを操作したり、出現しないデータを待機したりする場合があります。このようなシナリオの場合、アプリケーションはエラーメッセージをスローして、Salesforce ページ全体が停止します。コンポーネントは応答を停止します。
1vars.Timer = setInterval(function(){ helper.action(component); },1);

getCallback() を使用した修正コードの例

フレームワークに安全に再入するには、$A.getCallback() 関数でコードをラップします。次に、コンポーネントが依然として有効であることを保証するため、コールバックで処理を実行する前に component.isValid() 関数を使用します。

$A.getCallback() を使用して、setTimeout() コールや setInterval() コールの場合のように通常の再表示ライフサイクル外のコンポーネントにアクセスするコードをラップします。$A.getCallback() では、現在の実行コンテキストが保持され、非同期コードに正しいアクセスレベルが付与されます。それ以外の場合では、フレームワークでコンテキストが失われ、グローバルリソースへのアクセスのみが許可されます。

1window.setTimeout(
2   $A.getCallback(function() {
3      if(cmp.isValid()){ 
4         cmp.set("v.visible", true); 
5      }
6   }), 5000
7);

enqueueAction() を使用した修正コードの例

enqueueAction() を使用して、サーバー側コントローラーのアクションをアクション実行キューに追加する方法もあります。フレームワークでは、個々のアクションごとに個別の要求を送信するのではなく、イベントチェーンを処理し、キューのアクションを 1 つの要求にまとめます。これらのアクションは非同期で、コールバックが設定されます。

1var action = component.get(“c.usually_a_server_side_controller”);
2action.setCallback(this, function()(response) {...});
3$A.enqueueAction(action2);