クロスサイト・スクリプティング(XSS)とは
クロスサイト・スクリプティング(以下、XSS)とは、Web ページの出力処理に不備があるときに、悪意あるスクリプトを実行されてしまう脆弱性のことです。別サイトにある罠リンクをクリックすることで、サイトをまたがって(クロスサイト)スクリプトを実行するので、クロスサイト・スクリプティングと呼ばれます。
XSS は理解が難しい脆弱性なのですが、スクリプトが実行されるのはサーバー上ではありません。スクリプトは、Web ページの表示時に利用者のブラウザ上で実行されます。クロスサイト・リクエストフォージェリ(CSRF) はサーバー上で実行される脆弱性なので、違いに注意してください。
XSS は、深刻な脆弱性であるので、XSS の脆弱性が見つかったら早急に対処する必要があります。
- 本物のサイト上に偽ページが表示される
- → フィッシング・情報漏えい
- Cookie が漏洩する
- → セッション ID 漏洩によるなりすまし
- Cookie を書き換えられる
- → セッション ID の固定化攻撃
クロスサイト・スクリプティング(XSS)の具体例
XSS は言葉で説明されてもイメージがしにくい脆弱性です。以下の記事で、具体的にどのように XSS の脆弱性が悪用されるか説明していますので参考にしてください。
クロスサイト・スクリプティング(XSS)の対策
XSS の対策は広範囲に及ぶため、設計段階から取り組む必要があります。
XSS の根本的対策は、以下のようになります。
- 1.HTTP レスポンスヘッダーに文字コードを指定する
- 2.HTML 要素の属性は””(ダブルクオーテーション)で囲む
- 3.出力する全ての要素に対してエスケープ処理を行う
- 4.URL は「http://」か「https://」で始まるもののみ出力する
- 5.<script></script> 要素の内容を動的に生成しない
■1.HTTP レスポンスヘッダーに文字コードを指定する
HTTP のレスポンスヘッダーのContent-Type フィールドには、「Content-Type: text/html; charset=UTF-8」のように、文字コード(charset)を指定します。
HTML の META タグでも、Content-Type で charset を指定できますが、ブラウザの挙動に依存するため、確実に正しい文字コードで表示できるように、HTTP のレスポンスヘッダーで文字コードを指定するようにします。
■2.HTML 要素の属性は””(ダブルクオーテーション)で囲む
HTML 要素の属性を’’(シングルクォーテーション)で囲むと、3のエスケープ処理の方法によっては、XSS の脆弱性を埋め込んでしまう可能性があるので、必ず””(ダブルクオーテーション)で囲むようにします。
■3.出力する全ての要素に対してエスケープ処理を行う
出力する全ての要素に対して、以下の文字のエスケープ処理を行います。出力箇所が多く漏れやすいので、確実に対処するようにしてください。
エスケープ文字 | エスケープ後 | 必須? |
& | & | ○ |
< | < | ○ |
> | > | ○ |
“ | " | ○ |
‘ | ' | △ |
最近は、JavaScript で HTML を動的に生成することがありますが、その場合もエスケープ処理を行う必要があります。この点については、IPA より公開されている以下の資料を参照してください。
■4.URL は「http://」か「https://」で始まるもののみ出力する
URL は 「http://」や「https://」だけでなく、JavaScript を実行できる「javascript:」という記述もできます。スクリプトが注入されないように、URL は「http://」と「https://」から始まるもののみ出力します(ホワイトリスト方式)。
■5.<script></script> 要素の内容を動的に生成しない
<script></script> 要素内容の動的な生成は、安全な形でエスケープするのは非常に難しいため、動的に生成しないようにしてください。
どうしてもシステム要件として動的に生成する必要がある場合には、「体系的に学ぶ 安全なWebアプリケーションの作り方」にエスケープ方法が載っていますが、かなり難易度が高いことがわかると思います。
クロスサイト・スクリプティング(XSS)の保険的対策
XSS の保険的対策としては以下のものがありますが、完全に XSS を防ぐことはできないことに注意してください。
- 1.入力値のチェックを行う
- 2.Cookie に HttpOnly 属性を付与する
- 3.Trace メソッドを無効化する
■1.入力値のチェックを行う
&<>”’ などの危険な文字列が入力された場合に、エラーとしたり該当文字を削除する方法です。ですが、画面以外で作成された値には対応できません。
■2.Cookie に HttpOnly 属性を付与する
XSS は JavaScript で Cookie にアクセスしようとしますが、Cookie に HttpOnly 属性が付いている場合は JavaScript からはアクセスできません。但し、HttpOnly 属性は全てのブラウザで対応が同じではないことに留意する必要があります。
■3.Trace メソッドを無効化する
XSS の脆弱性がある場合に、TRACE メソッドが有効だと、クロスサイト・トレーシングという攻撃が成立し、HTTP リクエストヘッダーの内容を取得されてしまいます。Cookie に HttpOnly 属性を付けていても、HTTP リクエストヘッダーには Cookie は含まれるため、Cookie の漏洩を防ぐことができません。
参考
Webアプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。
コメント