この記事を作った動機
最近ちょっとした JavaScript のツールを作って使おうとしたところ、直接 HTML の文字列を innerHTML として渡すことができないことが分かった。
今の私の理解だと XSS(Cross Site Scripting) 対策のためにテキストデータとして紛れた悪意のある CSS や JavaScript コードなどを実行(反映)しないようにするために、追加された仕組みに引っかかったという認識である。“ポリシー"なるものを定義して、innerHTMLとかに設定されるテキストデータであったHTMLの文字列などを、事前に任意に定義した createHTML などの関数を通して、テキストデータの HTML化などを承認?するような動作を実装する必要があるというイメージである。
エラー内容
function setStyle(){
let style = document.createElement("style")
style.innerHTML = `
.positive{
background: red;
text-decoration: underline;
}
.negative{
background: blue;
text-decoration: underline;
}
`
document.body.appendChild(style)
}
setStyle()
// This document requires 'TrustedHTML' assignment. The action has been blocked.
暫定的な対処
以下はとにかく、自分で書いたスクリプトをすぐ動かしたい場合で、動作検証やプライベート目的で、理解したうえで利用することを想定したコード例であり、実用ではセキュリティの問題になるので真面目に悪意のあるコードが実行されないように createHTML などの定義を書く必要がある。
const policy = trustedTypes.createPolicy("my-policy", {
createHTML: (s) => s,
});
function setStyle(){
let style = document.createElement("style")
style.innerHTML = policy.createHTML(`
.positive{
background: red;
text-decoration: underline;
}
.negative{
background: blue;
text-decoration: underline;
}
`)
document.body.appendChild(style)
}
setStyle()
参考にしたサイトとか
- This document requires ‘TrustedHTML’ assignment. · Issue #482 · killergerbah/asbplayer
https://github.com/killergerbah/asbplayer/issues/482 (2026年2月18日) - asbplayer/extension/src/pages/youtube-page.ts at dd5f49f3ab97cd5b1eefa2cde113704a125e69b5 · killergerbah/asbplayer
https://github.com/killergerbah/asbplayer/blob/dd5f49f3ab97cd5b1eefa2cde113704a125e69b5/extension/src/pages/youtube-page.ts#L18 (2026年2月18日) - TrustedTypePolicyFactory: createPolicy() method - Web APIs | MDN
https://developer.mozilla.org/en-US/docs/Web/API/TrustedTypePolicyFactory/createPolicy (2026年2月18日) - TrustedTypePolicy - Web APIs | MDN
https://developer.mozilla.org/en-US/docs/Web/API/TrustedTypePolicy (2026年2月18日) - Trusted Types API - Web APIs | MDN
https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API (2026年2月18日)