XSSを防ぐ新しいXSS-Protectionヘッダ

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」という仕様を使用しています。

下記の例では、XSS-Protectionヘッダでノンス値を指定します。その場合、そのノンス値が指定されたスクリプトタグのみが実行されます。

XSS-Protection: { "nonce": "abcdefg" }
<!-- このスクリプトは実行される -->
<script src="script.js" nonce="abcdefg"></script>

<!-- このスクリプトは実行されません -->
<script src="script.js"></script>

指定できる項目

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 }