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

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

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

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

一般的な脆弱性は、ユーザ入力をページに表示する場合に発生します。次に例を示します。
1swfobject.registerObject("clippy.codeblock-0", "9");<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
HTMLENCODE 関数は、大なり記号 (>) などの HTML で予約されている文字を、&gt; などの HTML エンティティ文字に置き換え、HTML で使用するテキスト文字列や差し込み項目値を符号化します。
JSENCODE
新しい JSENCODE 関数は、バックスラッシュ (\) のようなエスケープ文字を、アポストロフィー (') のような安全でない JavaScript 文字の前に挿入して、JavaScript で使用するテキスト文字列や差し込み項目値を符号化します。
JSINHTMLENCODE
新しい JSINHTMLENCODE 関数は、エスケープ文字を、安全でない JavaScript 文字の前に挿入し、HTML で予約されている文字を HTML エンティティ文字に置き換えて、HTML タグ内の JavaScript で使用するテキスト文字列や差し込み項目値を符号化します。
URLENCODE
新しい URLENCODE 関数は、空白などの URL では不正な文字を RFC 3986, Uniform Resource Identifier (URI): Generic Syntax で定義されているようにこうした文字を表すコードに置き換え、URL で使用するテキスト文字列や差し込み項目を符号化します。たとえば、感嘆符は %21 に置き換えられます。
前述の例を保護するために HTMLENCODE を使用するには、<apex:outputText> を次のように変更します。
1<apex:outputText value=" {!HTMLENCODE(myTextField)}" escape="false"/>
ユーザが <script>alert('xss') を入力し、[更新] をクリックしても、JavaScript は実行されません。代わりに文字列が符号化され、ページには Value of myTextField is <script>alert('xss') と表示されます。
タグの代入およびデータの使用によって、エスケープされた文字およびエスケープが必要な文字が異なります。たとえば、次のような文の場合
1<script>var ret = "{!$CurrentPage.parameters.retURL}";script>var ret = "{!$CurrentPage.parameters.retURL}";</script>
リンクで使用されるため、URL では HTML エスケープ文字の " の代わりに %22 を使用して二重引用符をエスケープする必要があります。そうでない場合、次のような要求
1http://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>

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