ステップ 1: ユーザーが提供するエスケープ出力
ユーザーによって提供されたページ内にデータを含めたい場合は、出力をエスケープします。そして、この簡略化されたリストでは、HTML エンコードの <、>、&、'、" という 1 つの単純なエスケープ操作に固執します。たとえば、PHP は、この一般的なタスクを実行するために htmlspecialchars() 関数を提供します。
ステップ 2: 常に XHTML を使用する
OWASP の XSS 防止戦略を読むと、HTML で引用符で囲まれていない属性を使用している場合、インジェクションから保護するにはさらに多くの労力が必要であることが明らかになります。対照的に、引用符で囲まれた属性では、データのエスケープは、タグ内のコンテンツのデータをエスケープするために必要なプロセスと同じになります。これは、既に説明したエスケープ操作です。これは、引用された属性のコンテキスト内で構造的に重要なコンテンツに忍び込むという点で唯一の問題を引き起こすのは、最後の引用であるためです。
明らかに、引用符で囲まれた属性を含めるためにマークアップが XHTML である必要はありません。ただし、XHTML を対象にして検証すると、すべての属性が引用されているかどうかを簡単にテストできます。
ステップ 3: CSS と JavaScript で英数字データ値のみを許可する
ページの CSS および Javascript セクション内で出力されるユーザーから許可するデータを英数字 (例: [a-zA-Z0-9]+ のような正規表現) タイプに制限する必要があります。それらが真に価値を表す文脈。Javascript では、これは、変数に割り当てられた引用符で囲まれた文字列内でのみユーザー データを出力する必要があることを意味します (例: var userId = “ALPHANUMERIC_USER_ID_HERE”;)。CSS では、ユーザー データはプロパティ値のコンテキスト内でのみ出力する必要があることを意味します (例: p { color: #ALPHANUMERIC_USER_COLOR_HERE;}.) これは厳格に見えるかもしれませんが、これは単純な XSS チュートリアルのはずです
明確にするために、前の例のように、タグまたは属性内で出力されるデータであっても、常にユーザー データを検証して期待どおりであることを確認する必要があります。ただし、可能性のあるデータ構造が複雑であるため、XSS 攻撃を防ぐことが非常に困難になるため、CSS および JavaScript 領域では特に重要です。
Facebook、Youtube、Twitter ID など、ユーザーが JavaScript に提供できるようにする一般的なデータはすべて、この制限に対応しながら使用できます。また、CSS の色属性やその他のスタイルも統合できます。
ステップ 4: URL エンコード URL クエリ文字列パラメーター
ユーザー データがリンク クエリ文字列の URL パラメーター内で出力される場合は、データを URL エンコードしてください。繰り返しになりますが、例として PHP を使用すると、単純に urlencode() 関数を使用できます。ここで、この特定の点に関して多くの混乱を見てきたので、これを明確にして、いくつかの例に取り組みましょう。
URL エンコードが必要
次の例では、クエリ文字列の値として使用されるため、URL エンコードする必要があるユーザー データを出力します。
http://site.com?id=USER_DATA_HERE_MUST_BE_URL_ENCODED">
URL エンコードしてはならない
次の例では、URL 全体のユーザー指定データを出力します。この場合、ユーザー データは、URL エンコードではなく、標準のエスケープ関数 (HTML エンコードの <、>、&、'、") を使用してエスケープする必要があります。この例を URL エンコードすると、不正な形式のリンクが作成される可能性があります。