LockerService を使用したセキュアなコードの記述
LockerService による影響
LockerService は次の場所にセキュリティを適用します。
- Lightning Experience
- Salesforce1
- テンプレートベースのコミュニティ
- 独自に作成したスタンドアロンアプリケーション (myApp.app など)
LockerService は Salesforce Classic および Lightning Out (Visualforce での Lightning コンポーネントの使用を含む) には影響しません。
ブラウザサポート
ブラウザがいくつかの基本的な要件 (厳格モードと Map オブジェクトのサポート) を満たしていない場合、LockerService は自動的に無効になります。このポリシーは、Lightning Experience でサポートされているブラウザと同じです。
LockerService を無効にすると、サポートされていないブラウザでより多くのグレースフルデグラデーションが提供されます。
LockerService 要件
- JavaScript ES5 の厳格モードの適用
- JavaScript ES5 の厳格モードが暗黙的に有効になります。コードで "use strict" を指定する必要がありません。var キーワードを使用した変数の宣言や、JavaScript コーディングのその他のベストプラクティスなどが適用されます。コンポーネントが使用するライブラリも厳格モードで動作する必要があります。
- DOM のアクセスコンテインメント
- コンポーネントは、DOM をトラバースし、このコンポーネントによっ��作成された要素のみにアクセスできます。この動作により、アンチパターンが、他のコンポーネントが所有する DOM 要素に到達できなくなります。
- グローバル参照の制限
- LockerService はグローバル参照に制限を適用します。Array など、組み込みオブジェクトにはアクセスできます。window など、組み込み以外のオブジェクトは LockerService がセキュアなバージョンを用意します。オブジェクトのこのセキュアなバージョンが、オブジェクトおよびそのプロパティへのアクセスを自動的かつシームレスに制御します。
- Salesforce Lightning CLI ツールを使用して、コードをスキャンし、Lightning 固有の問題がないか調べます。
- サポートされている JavaScript API フレームワークのメソッドのみへのアクセス
- サポートされている公開済みの JavaScript API フレームワークのメソッドにのみアクセスできます。これらのメソッドは、https://yourDomain.lightning.force.com/auradocs/reference.app にあるリファレンスドキュメントアプリケーションで公開されています。以前はサポートされていないメソッドにアクセスできたため、サポートされていないメソッドが変更または削除されたときにコードが破損するおそれがありました。
上記のセキュリティ機能は、LockerService が組織内で有効である場合に適用されます。LockerService は、今回のリリースの重要な更新です。Summer '17 リリースで、LockerService がすべての組織で自動的に有効になります。Summer '17 リリースの前は、更新の有効化および無効化を必要に応じて手動で何度でも行って組織への影響を評価することができます。
- コンテンツセキュリティポリシー (CSP) の厳格化
- LockerService は CSP を強化して、クロスサイトスクリプティング攻撃の可能性を排除します。これらの CSP の変更は、Sandbox 組織および Developer Edition 組織でのみ適用されます。
- 厳格な CSP によってインラインスクリプト (script-src) の unsafe-inline および unsafe-eval キーワードが禁じられます。eval() またはインライン JavaScript コード実行を使用してすべてのコールを削除し、使用するコードとサードパーティライブラリがこれらのルールに従っていることを確認してください。サードパーティライブラリを unsafe-inline や unsafe-eval に依存しない最近のバージョンに更新する必要がある可能性があります。
instanceof は使用不可
LockerService が有効の場合は、複数のウィンドウまたはフレームが存在する可能性があるため、instanceof 演算子の信頼性が低下します。変数種別を判断する場合は、代わりに typeof を使用するか、JavaScript の標準メソッド (Array.isArray() など) を使用します。
重要な更新の有効化
LockerService は、今回のリリースの重要な更新です。Summer '17 リリースで、LockerService がすべての組織で自動的に有効になります。Summer '17 リリースの前は、更新の有効化および無効化を必要に応じて手動で何度でも行って組織への影響を評価することができます。
この重要な更新を有効化する手順は、次のとおりです。
- [設定] から、[クイック検索] ボックスに「重要な更新」と入力して、[重要な更新] を選択します。
- [Lightning LockerService セキュリティの有効化] の [有効化] をクリックします。
- ブラウザページを更新して、LockerService の有効化に進みます。
LockerService を Sandbox 組織または Developer Edition 組織でテストして、コンポーネントが正しく動作することを確認してから本番組織で有効にすることをお勧めします。
管理パッケージからインストールされたコンポーネント
管理パッケージからインストールされたコンポーネントで LockerService が適用されるかどうかを制御する手順は、次のとおりです。
- [設定] から、[クイック検索] ボックスに「Lightning コンポーネント」と入力し、[Lightning コンポーネント] を選択します。
- 管理パッケージからインストールされたコンポーネントで LockerService を適用するには、[管理パッケージに対して LockerService を有効にする] チェックボックスをオンにします。
[管理パッケージに対して LockerService を有効にする] チェックボックスをオフにすると、管理パッケージからインストールされたコンポーネントで LockerService が適用されません。組織で作成したコンポーネントは LockerService の制限が適用された状態で実行されます。
新規組織のデフォルト設定
次の表に、新規組織に LockerService が適用される状況がまとめられています。
組織で作成されたコンポーネントは、デフォルトの名前空間 c または組織の名前空間 (名前空間を作成している場合) にあります。
| コンポーネントのソース | Developer Edition | サポートされている他のすべてのエディション |
|---|---|---|
| 組織で作成 | ○ | ○ |
| 管理パッケージ | ○ | × |
LockerService の適用を変更するには、重要な更新 (組織で作成されたコンポーネントの場合) または [管理パッケージに対して LockerService を有効にする] チェックボックス (管理パッケージからのコンポーネントの場合) を切り替えます。