X-XSS-Protection
非標準: この機能は標準ではなく、標準化の予定もありません。公開されているウェブサイトには使用しないでください。ユーザーによっては使用できないことがあります。実装ごとに大きな差があることもあり、将来は振る舞いが変わるかもしれません。
HTTP の X-XSS-Protection
レスポンスヘッダーは Internet Explorer, Chrome, Safari の機能で、反射型クロスサイトスクリプティング (XSS) 攻撃を検出したときに、ページの読み込みを停止するためのものです。サイトが強力な Content-Security-Policy
を実装しており、インライン JavaScript ('unsafe-inline'
) の使用を無効にしている場合、これらの保護は現代のブラウザーではほとんど不要となります。
警告: この機能は、まだ CSP に対応していない古いブラウザーのユーザーを保護できるにもかかわらず、場合によっては、他の安全なウェブサイトでXSS 保護機能が XSS の脆弱性を作り出す可能性があります。詳細については、下記の節を参照してください。
メモ:
- Chrome は XSS Auditor を削除しました。
- Firefox は対応しておらず、
X-XSS-Protection
を今後も実装しません - Edge は XSS filter を廃止しました。つまり、古いブラウザーに対応する必要がない場合は、代わりに
Content-Security-Policy
を使用しunsafe-inline
を許可しないことをお勧めします。
構文
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>
- 0
-
XSS フィルタリングを無効化します。
- 1
-
XSS フィルタリングを有効化します(通常はブラウザーの既定値です)。クロスサイトスクリプティング攻撃を検知すると、ブラウザーはページをサニタイズします(安全でない部分を取り除きます)。
- 1; mode=block
-
XSS フィルタリングを有効化します。攻撃を検知すると、ページをサニタイジングするよりも、ページのレンダリングを停止します。
- 1; report=<reporting-URI> (Chromium only)
-
XSS フィルタリングを有効化します。クロスサイトスクリプティング攻撃を検知すると、ブラウザーはページをサニタイズし、攻撃レポートを作成します。レポートを送信するために、 CSP
report-uri
ディレクティブ機能を利用します。
XSS フィルタリングに起因する脆弱性
あるウェブページの抜粋である以下の HTML コードを考えてみましょう。
<script>
var productionMode = true;
</script>
<!-- [...] -->
<script>
if (!window.productionMode) {
// 脆弱性のあるデバッグコード
}
</script>
このコードは、ブラウザーが XSS フィルタリングを行わない場合は、完全に安全です。しかし、もしブラウザーがフィルタリングを行い、検索クエリーが ?something=%3Cscript%3Evar%20productionMode%20%3D%20true%3B%3C%2Fscript%3E
である場合、ブラウザーはページ内のスクリプトを <script>var productionMode = true;</script>
の部分を(URI にあったためサーバーがそれをレスポンスに記載したと思い)無視して残りを実行するかもしれません、 window.productionMode
が undefined
と評価されて安全ではないデバッグコードを実行させる原因となることが考えられます。
X-XSS-Protection
ヘッダーを 0
または 1; mode=block
のいずれかに設定すると、上記のような脆弱性を防ぐことができます。前者はブラウザーがすべてのスクリプトを実行するようにし、後者はページがまったく処理されないようにします(ただし、この手法はウェブサイトが <iframe>
に埋め込まれている場合は、サイドチャネル攻撃に対して脆弱になる可能性があります)。
例
XSS 攻撃が反映されたページを見つけたらその読み込みをブロックする場合。
X-XSS-Protection: 1; mode=block
PHP
header("X-XSS-Protection: 1; mode=block");
Apache (.htaccess)
<IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule>
Nginx
add_header "X-XSS-Protection" "1; mode=block";
仕様書
仕様書や草案で定義されたものではありません。
ブラウザーの互換性
BCD tables only load in the browser