コンテンツセキュリティポリシーが設定されている親ページがあります。 CSPの主な目的は、XSSを防ぐことではなく、ネットワークアクセスを防ぐことです。このページでは、ユーザーが生成/送信したHTML/CSS/JSを実行する必要があります。 document.writeを使用してユーザーコンテンツをこのiframeに書き込むことにより、iframeでこのユーザーコンテンツを実行しています。
注:私が持っているユーザーコンテンツはサーバーにアップロードまたは存在していませんが、動的に利用できます-なんらかのフォームを使用して言ってください。
また、ユーザーコンテンツには、親ページのCSPと、子iframeによって作成されたすべてのiframeも継承します。
仕様に従ってiframeに適用されるポリシー:
埋め込みリソースのポリシーは、何を埋め込むことができるかを制御します。ただし、埋め込みリソースは、リソースで提供されるポリシー、または埋め込みリソースがグローバルに一意の識別子(またはsrcdocフレーム)の場合は埋め込みリソースのポリシーによって制御されます。
したがって、標準では、親ページはグローバルに一意の識別子ではないため、ポリシーは継承されないことが規定されています。次の理由により、srcdoc iframeを使用したくない
しかし、ひねりがあります:
私がブラウザでこの継承をテストしたところ、cspは実際にはChrome、Safari、Firefoxでは継承されていましたが、Edgeでは継承されていませんでした。これは私にはかなり論理的で正しいようです。
これが私が行ったサンプルテストです:
<html>
<head>
<!-- CSP just for demo purposes - not the actual csp -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'"/>
</head>
<body>
<h1>Parent Content</h1>
<p style="font-weight: bold; font-family: arial, sans-serif;">
The image here will be blocked due to CSP (default-src directive).
However the iframe's image will not be blocked on Edge since the CSP is not inherited.
</p>
<img src="http://www.w3schools.com/html/pic_mountain.jpg"/>
<script>
window.addEventListener("DOMContentLoaded", function() {
// creating the child iframe
// Some user controlled HTML content.
var html = "<html><body><h1>Child Content</h1><img src='http://www.w3schools.com/html/pic_mountain.jpg'/></body></html>";
var iframe = document.createElement("iframe");
iframe.setAttribute("height", "400px");
iframe.setAttribute("width", "400px");
document.body.appendChild(iframe); //need to append first to be able to write into the iframe.
var iframeDoc = iframe.contentWindow.document;
iframeDoc.open();
iframeDoc.write(html);
iframeDoc.close();
});
</script>
</body>
</html>
だから、最後に私の質問は:
もっと考え:
仕様(およびEdge)がiframeに適用されるCSPを処理すると、XSSを防ぐためにスクリプトの「安全でないインライン」を許可するリスクがさらに高まります。そのため、攻撃者はこのようなdocument.writeを使用して、自分の悪意のあるサイトへのiframeの作成をトリガーすることもできます。 child-src/frame-src 'none'でも、document.writeを使用したiframeの作成を停止しません。これはセキュリティにとって非常に悪いことではありませんか?
3の場合は、それが存在する可能性があり、他のページ/コンテンツでより厳密なCSPを設定できるようにする必要があります。
https://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/ によると、iframeに特定の権限を与える(または削除する)ことができます。
Iframeサンドボックスはすべてのターゲットブラウザでサポーターのようです: http://caniuse.com/#feat=iframe-sandbox
したがって、純粋に親ページのCSPポリシーに依存するのではなく、適切なサンドボックスを使用してiframeを作成する場合があります。
(私にとって)不明なのは、誰かがiframeのサンドボックスを変更した場合に発生することです