Trusted Types
DOM Based XSS を防ぐ「Trusted Types」という仕様が、W3CのWeb Incubator Community Group (WICG)
で議論されています。
Trusted Typesでは、element.innerHTML
などにPolicyにあった値(TrustedHTML)のみが代入できるように制限されます。
TrustedHTMLの他にも、同様に指定したポリシーTrustedScript, TrustedScriptURL, TrustedURLなどがあります。
例
すでに、Polyfillが提供されているので実行してみる。
TrustedTypes.createPolicy
で適応するPolicyを宣言し、文字列を引数としてcreateHTML
メソッドでTrustedHTMLを作成する。
このTrustedHTMLのみが、element.innerHTML
に代入できる。
直接文字を代入しようとするとTypeErrorとなる。
<script src="https://wicg.github.io/trusted-types/dist/es5/trustedtypes.build.js" data-csp="trusted-types mypolicy"></script>
<script>
function customSanitize(s){
return s.replace("<", "<");
}
const p = TrustedTypes.createPolicy('mypolicy',{
createHTML: (s) => { return customSanitize(s) },
});
e = document.getElementsByTagName('div')[0]
e.innerHTML = p.createHTML('<test>'); // does not throw. e.innerHTML == '<test>'
e.innerHTML = "<test>" // TypeError.
</script>
Trusted-TypesヘッダでPolicy指定することで、そのポリシーのみを適応可能になる。勝手にポリシーを作ったり、上書きでない。
Trusted-Types: "one", "two", "default"
感想
仕様が難しく、ポリシーの適応周りあまりちゃんと理解できなかった...