進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

Lightning Platform に組み込まれている XSS 保護の確認

学習の目的

この単元を完了すると、次のことができるようになります。
  • Salesforce が自動 HTML でクロスサイトスクリプトから開発者を保護する方法を理解する。
  • 自動 HTML が適用されない場所および開発者が無効化できる場所を把握する。
  • Lightning Platform アプリケーションで一般に XSS が出現する場所を挙げる。

Lightning Platform の XSS 保護

前の単元では、XSS についてのすべて、および Web アプリケーションで XSS を防止するための一般的な手法について学習しました。XSS 保護のための 2 つの一般的なアプローチ (入力フィルタリングと出力エンコーディング) について説明しました。では、アプリケーションを保護するために Salesforce は何をするのでしょうか?

Salesforce はプラットフォームとして、データへのアクセスおよびデータの保存において、お客様および開発者に最大限の柔軟性を提供しています。入力フィルタリングを採用した場合、お客様の意に反してそのデータから重要な情報を削除してしまうことがあります。このため、Salesforce の XSS 防御アプローチは 100% 出力エンコーディングです。ユーザがプラットフォームに何を配置するかは制御しませんが、可能な限り、それらが安全に表示されるようにします。実際に、デフォルトでは、すべての差し込み項目が自動的に HTML エンコードされます。

この単元では、このデフォルトの保護のしくみについて詳しく説明します。また、アプリケーションで認識し、明らかにすべきギャップについても説明します。

自動 HTML エンコーディング

前に説明したように、Salesforce では、HTML コンテキストのすべての値および差し込み項目を自動的に HTML エンコードします。これには、すべての標準機能および Visualforce ページならびにコンポーネントが含まれます。

次に例を示します。

<apex:outputText value="{!$CurrentPage.parameters.userName}" />

理論上、ユーザが行った入力はページのコンテキストに反映されるため、コードは XSS に対して脆弱です。ただし、Lightning Platform のおかげで、このコードは脆弱ではありません! URL が/page?userName=<script> である場合、以下がページに表示されます。

<script>

ページのソースコードを調べると、以下が表示されます。

&lt;script&gt;

プラットフォームで特殊文字が自動的に HTML エンコードされ、「<」と「>」が「&lt;」と「&gt;」に変更されます。プラットフォームでは、データはコードではなくテキストとして処理されます。

自動 HTML エンコーディングの無効化

Salesforce はこの機能を開発者に標準で提供していますが、使用事例によってはページに未加工の HTML を埋め込むことが必要な場合もあります。これをサポートするために、一部の Visualforce タグには、「escape」という省略可能な属性が用意されています。自動エンコーディングを無効化するには、「escape」を false に設定します。

次に例を示します。

<apex:outputText escape="false">
    Hello {!$CurrentPage.parameters.userName}
</apex:outputText>

特定の使用事例でエンコーディングを無効化する必要がある場合は、細心の注意を払って行う必要があります。自動エンコーディングを無効化する場合、他の XSS 防止手法 (ホワイトリスティングなど) を利用して、コードが XSS に対して脆弱でないようにする必要があります。

さまざまな実行コンテキストでの Salesforce のデフォルトの保護

プラットフォームでは、HTML コンテキストでのみ、差し込み項目を自動的に HTML エンコードします。このため、この保護を正しく活用するには、ブラウザによってユーザ制御変数がどのように表示されるかを十分に理解する必要があります。

HTML コンテキスト

<apex:outputtext>
    {!$CurrentPage.parameters.userInput} <! -- safe (auto HTML Encoded) -->
</apex:outputtext>

ユーザ入力が HTML コンテキストに挿入されていますが、プラットフォームで入力が自動的に HTML エンコードされるため、このステートメントは安全です。

<div>
    {!$CurrentPage.parameters.userInput} <! -- safe (auto HTML Encoded) -->
</div>

前と同様に、プラットフォームで自動的に HTML エンコードされるため、HTML コンテキストに挿入されたユーザ入力は安全です。

自動エンコーディングでは、HTML 属性内の <、>、および引用符の HTML エンコーディングのみが行われることに注意してください。アプリケーションが複数の解析コンテキストを通過する場合、この保護では不十分です

<div onclick=”console.log(‘{!$CurrentPage.parameters.userInput}’)”>Click me!</div>

上記のコードサンプルでは、ユーザ入力は HTML コンテキストに埋め込まれている JavaScript 実行コンテキストで表示されます。自動 HTML エンコーディングだけでは不十分です

スクリプトコンテキスト

JavaScript に差し込み項目を挿入する場合は、XSS の脆弱性に気を付けてください。次の例を見てみましょう。

<script>
    var x = ‘{!$CurrentPage.parameters.userInput}’; // vulnerable to XSS
</script>

ここではユーザ入力がスクリプトコンテキストに挿入されているため、値は自動的にエンコーディングされず、XSS に対して脆弱です。

スタイルコンテキスト

CSS (カスケードスタイルシート) は次第に複雑な言語になってきており、徐々にブラウザ間で標準化されています。最近のブラウザでは CSS 属性値内での JavaScript インジェクションは許可されません。ただし、一部の古いブラウザでは許可されます。このため、スタイルコンテキスト内での差し込み項目の使用には注意してください。

<style>
    .foo {
        Color: #{!CurrentPage.parameters.userInput}; // vulnerable to XSS
    }
</style>

上記のコードでは、デフォルトの自動 HTML エンコーディングは適用されず、アプリケーションは XSS に対して脆弱です。

XSS での次のステップ

Lightning Platform はいくつかの基本的な使用事例で開発者を XSS から保護しますが、開発者が独自のエンコーディングを行ってアプリケーションが脆弱でないことを確認する必要がある事例 (<script> タグ、<style> タグ、アクションハンドラなど) もあります。

Salesforce で開発者に提供されているエンコーディング機能で、これを行うことができます。次の単元ではこのしくみについてさらに詳しく説明し、さまざまな使用事例に適切に対応する方法を示します。

リソース

Flower icon used to indicate that the content is for Salesforce Classic

このモジュールは Salesforce Classic 向けです。ハンズオン組織を起動するときには、Salesforce Classic に切り替えてから、この Challenge を実行してください。