Net*_*bby 3 javascript iframe jquery node-webkit
我正在动态创建 iframe,并且我想阻止不是源自 iframe 来源的脚本。这甚至可能吗(通过 JavaScript/jQuery)?例如,如果我的页面从example.com内容加载 iframe :
<script src="http://example.com/foo.js"></script>
<script src="http://something-else.com/bar.js"></script>
Run Code Online (Sandbox Code Playgroud)
我希望example.com脚本运行,但我希望something-else.com脚本被阻止而不是运行。
我正在使用NW.js(以前称为 Node-Webkit),所以我对 iframe 的内容有完全的读写访问权限,就好像它们是同源的一样。
我试过使用插件(比如那些在图片中带有 CORS 的插件,带有白名单),但我试过的任何东西都不起作用。
除了 iframe 的来源之外,理想的解决方案还允许我将特定的其他来源列入白名单。
编辑:
这是我的浏览器项目,我试图在:https : //github.com/IdeasNeverCease/Aries
这是 iframe 加载完成的代码部分:https : //github.com/IdeasNeverCease/Aries/blob/master/app.nw/resources/scripts/aries.js#L376-L687
我想阻止不是来自 iframe 源的脚本
这正是内容安全策略(CSP) 的用途。CSP 可以指定脚本、插件、样式、媒体等允许哪些来源。您需要使每个 iframe 都有一个 CSP,以防止脚本加载到当前来源之外;这可以通过简单的策略来完成script-src 'self' 'unsafe-inline';(unsafe-inline允许 iframe 具有内联脚本,并且self只限制对同源资源的加载)
传统上,您需要服务器Content-Security-Policy在提供页面时发送响应标头。但是,如果你没有在服务器发送的响应头控制(但不具有对页面内容的控制),你可以模仿一个HTTP响应头有<meta>像这样的标签:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';">
Run Code Online (Sandbox Code Playgroud)
您可以以编程方式注入它(但请继续阅读以了解问题):
var m = document.createElement("meta");
m.httpEquiv = "content-security-policy";
m.content = "script-src 'self' 'unsafe-inline';";
iframeElem.contentDocument.documentElement.appendChild(m);
Run Code Online (Sandbox Code Playgroud)
但是,这种基于脚本的注入可能对您不起作用,因为在从 HTML 源解析 DOM 之后,您将只有一个 DOM 可以使用。那时,来自任何(非async)<script>元素的脚本将已经被获取并运行。您可能需要直接操作 HTML,但我对 NW.js 的了解不够,无法告诉您最好的方法。
如果您想禁止所有外部脚本资源(甚至来自同一来源的资源),您可以使用script-src 'none' 'unsafe-inline';. 要禁止所有脚本,包括加载的脚本和内联脚本,请使用script-src 'none';
为了将特定来源列入白名单,只需将它们添加为 CSP 中未引用的项目:
Content-Security-Policy: script-src 'self' *.twitter.com https://api.facebook.com
Run Code Online (Sandbox Code Playgroud)
前导*.允许所有子域,前导https://将该域的白名单限制为https://仅保护地址。