我想阻止不是源自 iframe 源的脚本
这正是内容安全政策 http://www.html5rocks.com/en/tutorials/security/content-security-policy/(CSP) 是为了。 CSP 可以指定允许脚本、插件、样式、媒体等使用哪些源。您需要使每个 iframe 都有一个 CSP,以防止脚本加载到当前源之外;这可以通过简单的策略来完成script-src 'self' 'unsafe-inline';
(the unsafe-inline
允许 iframe 有内联脚本并且self
仅限制加载同源资源)
传统上,您需要服务器发送Content-Security-Policy
提供页面时的响应标头。但是,如果您无法控制服务器发送的响应标头(但do可以控制页面内容)您可以使用以下内容模仿 HTTP 响应标头<meta>
像这样标记:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';">
您可以通过编程方式注入(但请继续阅读以了解问题):
var m = document.createElement("meta");
m.httpEquiv = "content-security-policy";
m.content = "script-src 'self' 'unsafe-inline';";
iframeElem.contentDocument.documentElement.appendChild(m);
但是,这种基于脚本的注入可能不适合您,因为在从 HTML 源解析 DOM 后,您只能使用 DOM。当时,来自任何(非async
) <script>
元素已经被获取并运行。您可能需要直接操作 HTML,但我对 NW.js 的了解还不够,无法告诉您执行此操作的最佳方法。
如果你想禁止all外部脚本资源(甚至是来自同一来源的),您可以使用script-src 'none' 'unsafe-inline';
。禁止all脚本,包括加载脚本和内联脚本,使用script-src 'none';
为了将特定来源列入白名单,只需将它们添加为 CSP 中未加引号的项目:
Content-Security-Policy: script-src 'self' *.twitter.com https://api.facebook.com
领先的*.
允许所有子域和前导https://
限制该域的白名单以确保安全https://
仅地址。