> Uncaught TypeError: Document.write: Sink type mismatch violation blocked by CSP
直し方おしえろください
エラーの意味は「CSPの require-trusted-types-for 'script' によって、document.write への文字列代入がブロックされた」というものです。github+1
対応は大きく分けて「CSP側を緩める」か「コード側を直す」の2択になります。blog.jxck+1
まず確認すること
-
実際に出ているエラー全文(例:
CSPTrustedTypesSinkViolation) -
レスポンスヘッダの
Content-Security-Policy(ブラウザの開発者ツール → Network → 該当リクエスト → Headers → Response Headers)-
require-trusted-types-for 'script'が入っているかを確認する。qiita+1
-
手っ取り早い回避(開発・検証用)
「Trusted Types いらない」「とにかく動かしたい」なら:
-
サーバー側で付けている CSP ヘッダから
require-trusted-types-for 'script'を削除する。blog.jxck+1 -
もし meta タグで CSP を設定しているなら、その中から同じ指定を削除する。
ただしこれはセキュリティを弱めるので、本番環境では非推奨です。qiita+1
ちゃんと直すパターン(推奨)
Trusted Types を有効にしたまま直したい場合は、生の document.write をやめる必要があります。blog.jxck+1
よくある修正パターン:
-
そもそも
document.write自体をやめて、以下のような通常の DOM 操作に置き換える-
element.textContent = ... -
element.insertAdjacentHTML(...)も Trusted Types の対象なので注意。qiita
-
-
どうしても HTML を差し込みたい場合は Trusted Types のポリシーを作る(上級者向け)
例(イメージ):jsconst policy = trustedTypes.createPolicy('appPolicy', { createHTML(input) { // ここでサニタイズ等を行う return input; }, }); document.write(policy.createHTML('<p>safe</p>'));このように
TrustedHTMLを返す関数を経由すれば、CSPのrequire-trusted-types-for 'script'を満たせます。qiita
どこを触ればいいかわからない場合
-
自分でCSPを設定していないのにエラーが出る →
フレームワーク / SaaS / 親ページ側でCSPが強制されている可能性があります。powerdaaps.hatenablog
その場合は:-
そのサービスの設定画面やドキュメントで「Content Security Policy」「Trusted Types」関連の設定を探す。powerdaaps.hatenablog+1
-
そこで
require-trusted-types-for 'script'をオフにするか、推奨される回避方法に従う。
-
あなたのコードを直すのを手伝う
document.write を使っている箇所のコード(と、CSPヘッダ or meta タグの中身)が分かれば、
「ここをこう書き換えればOK」という具体的な修正例を出せます。
-
関連する HTML(
<meta http-equiv="Content-Security-Policy" ...>があればそこ) -
document.writeを呼んでいる JavaScript
この2つを貼ってもらえれば、コピペで差し替えられる形で修正版を書きます。
Follow-ups
Viewing a shared thread. Your follow-ups will be private to you.
Ask a follow-up