evalとreportOnlyについて追記しました (2016/10/10)
2016/10/20
仕様名は以下の通りになりました。Anti-XSS Response-Time Uniqueness Requirement
また、ヘッダ名は、XSS-Protectionヘッダではなく、ARTURヘッダとなっておりますが、また変更される可能性があります。
Googleの調査によると、CSPによるXSSの防止は現実的にデプロイの欠陥によりXSSの防止効果がないことを示しています。調査は「CSP Is Dead, Long Live CSP!」としてACMのカンファレンスで発表され、ペーパーも閲覧することができます。
9月に行われたW3C TPAC 2016のWebAppSecのミーティングで議論され、GoogleのMike West氏より新しくXSS Protectionという仕様が提案されている。仕様は氏のリポジトリから確認することができる。
https://mikewest.github.io/artur-yes/
このXSS Protectionは、新しくXSS-Protectionヘッダを定義し、CSPの一部の機能を引き取りX-XSS-Protectionでサポートされているような機能を有します。目的は簡潔でわかりやすく、CSPと同等のXSS軽減機能を提供することです
XSS-Protectionヘッダ
XSS-Protectionヘッダは、json形式のヘッダ値を持ちます。
これについては、現在IETFで議論されている「A JSON Encoding for HTTP Header Field Values」という仕様を使用しています。
指定できる項目
eval
XSS-Protectionでは、デフォルトではevalはブロックされますがevalメンバーにunsafe-allowを指定することで、hashなどの条件が一致する場合は実行できるようになります
XSS-Protection: { "hash": [ "sha256-abcd...", "sha256-zyx...", "eval": "unsafe-allow" ] }
hash
XSS-Protection: { "hash": [ "sha256-abcd...", "sha256-zyx..." ] } <script src="script.js" integrity="sha256-abcd..."></script> <script> // Content which hashes to abcd... goes here. </script>
nonce
実行を許可するScriptに指定されるノンス属性の値を指定
XSS-Protection: { "nonce": "abcdefg" } <script src="script.js" nonce="abcdefg"></script>
reflection
反射型XSSに対するポリシーに対して、ignore, filter, blockを指定する。ignoreの場合はユーザエージェントの保護機能を無効にする、filterはユーザエージェントのXSS検知機能で、検知された場合はそのスクリプトの実行をブロックする。blockは、ユーザエージェントのXSS検知機能で検出された場合にそのページのロード自体をブロックする。
XSS-Protection: { "reflection": "block" }
report
Reporting APIに則ってレポートグループを指定する。
reportOnlyを指定することで、ブロックはせずレポートだけを送ることもできます。
XSS-Protection: { "nonce": "abcdefg", "report": "group1" } Report-To: { "url": "https://example.com/report", "group": "group1", "max-age": 10886400 }