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

Visualforce ページのエスケープされない出力と式

escape 属性を false に設定するコンポーネントを使用する場合、または Visualforce コンポーネント外の式を含める場合は、出力がフィルタ処理されないため、セキュリティの検証が必要です。これは、数式を使用する場合は特に重要です。

数式は関数コールとして使用したり、プラットフォームオブジェクト、ユーザの環境、システム環境、要求の環境に関する情報を含めることができます。式が生成する出力が表示されるときにエスケープされないことを認識することが重要です。式はサーバに表示されるため、JavaScript またはその他のクライアント側の技術を使用してクライアントの表示データをエスケープすることはできません。このため、数式が非システムデータ (つまり、悪意のあるデータや編集可能なデータ) を参照し、式自体が表示中に出力をエスケープする関数にラップされていない場合、危険な状況を誘発する場合があります。

一般的な脆弱性は、ユーザ入力をページに表示する場合に発生します。次に例を示します。
1<apex:page standardController="Account">
2  <apex:form>
3    <apex:commandButton rerender="outputIt" value="Update It"/>
4    <apex:inputText value="{!myTextField}"/>
5  </apex:form>
6
7  <apex:outputPanel id="outputIt"> 
8    Value of myTextField is <apex:outputText value="{!myTextField}" escape="false"/>
9  </apex:outputPanel>    
10</apex:page>
エスケープされない {!myTextField} によっても、クロスサイトスクリプトの脆弱性が誘発されます。たとえば、以下を入力するとします。
1<script>alert('xss')
そして、[更新] をクリックすると、JavaScript が実行されます。この場合、アラートダイアログが表示されますが、悪意のある使用が設定されている場合があります。
安全でないと考えられる文字列をエスケープするために使用できる関数があります。
HTMLENCODE
大なり記号 (>) などの HTML で予約されている文字を &gt; などの HTML エンティティ文字に置き換えて、HTML で使用するテキスト文字列や差し込み項目値をエンコードします。
JSENCODE
バックスラッシュ (\) などのエスケープ文字をアポストロフィー (') などの安全でない JavaScript 文字の前に挿入して、JavaScript で使用するテキスト文字列や差し込み項目値をエンコードします。
JSINHTMLENCODE
HTML で予約されている文字を HTML エンティティ文字に置き換え、エスケープ文字を安全でない JavaScript 文字の前に挿入して、HTML タグ内の JavaScript で使用するテキスト文字列や差し込み項目値をエンコードします。JSINHTMLENCODE(someValue) は、JSENCODE(HTMLENCODE((someValue)) と同等の便利な関数です。つまり、JSINHTMLENCODE は最初に HTMLENCODEsomeValue をエンコードしてから、JSENCODE で結果をエンコードします。
URLENCODE
RFC 3986, Uniform Resource Identifier (URI): Generic Syntax の定義に従って、URL では不正な空白スペースなどの文字を、これらの文字を表すコードに置き換えて、URL で使用するテキスト文字列や差し込み項目をエンコードします。たとえば、空白スペースは %20 に置き換えられ、感嘆符は %21 に置き換えられます。
前述の例を保護するために HTMLENCODE を使用するには、<apex:outputText> を次のように変更します。
1<apex:outputText value=" {!HTMLENCODE(myTextField)}" escape="false"/>
ユーザが <script>alert('xss') を入力し、[更新] をクリックしても、JavaScript は実行されません。代わりに文字列が符号化され、ページには Value of myTextField is <script>alert('xss') と表示されます。
タグの代入およびデータの使用によって、エスケープされた文字およびエスケープが必要な文字が異なります。たとえば、Visualforce 要求パラメータを Javascript 変数にコピーする次のステートメントを考えてください。
1<script>var ret = "{!$CurrentPage.parameters.retURL}";</script>
これは、HTML エスケープ文字の " の代わりに、URL エンコード文字の %22 を使用して、要求パラメータの二重引用符をエスケープする必要があります。そうでない場合、次のような要求
1https://example.com/demo/redirect.html?retURL=%22foo%22%3Balert('xss')%3B%2F%2F
では、次のようになります。
1<script>var ret = "foo";alert('xss');//";</script>
ページの読み込み時に JavaScript が実行され、アラートが表示されます。
この場合、JavaScript が実行されないように、JSENCODE 関数を使用します。例
1<script>var ret = "{!JSENCODE($CurrentPage.parameters.retURL)}";</script>

また、数式タグを使用して、プラットフォームオブジェクトデータを追加することもできます。データがユーザの組織から直接取得されますが、データをエスケープしてユーザが他のユーザ (権限レベルがより高いユーザ) のコンテキストでコードを実行できなくなります。これらの種類の攻撃は同じ組織内のユーザによって実行され、組織のユーザロールを弱体化し、データ監査の完全性を提言させてしまいます。また、多くの組織には、外部の供給元からインポートされたデータがありますが、悪意のあるコンテンツの除外が行われない場合があります。