切换iFrame沙箱

4

我正在尝试弄清楚是否可以通过编程方式更改iFrame的沙盒值。

来自MDN iframe

当嵌入的文档与主页面具有相同的来源时,强烈不建议同时使用allow-scripts和allow-same-origin,因为这允许嵌入的文档以编程方式删除沙盒属性。虽然它被接受,但这种情况不比不使用沙盒属性更安全。

然而,在父级中更改属性并不能成功地触发沙盒化,因为那将意味着在子级中进行。

document.getElementById('myFrame').setAttribute('sandbox', 'allow-scripts');

如果启用沙箱,则加载在 iFrame 中的页面无法成功访问父级。但由于该属性未能阻止对父级的访问,因此安全性存在缺陷,需要加强。

console.log(window.parent.document);

上述仍适用于启用了“编程方式”沙箱的iFrame。这在Chrome和Firefox中都是如此,这可能意味着有意未记录的功能或规范实现不佳。

是否有人对适当的期望有任何想法?

2个回答

0

当我尝试在沙盒iframe内动态创建iframe内容时,我遇到了类似的问题。我尝试使用JavaScript在iframe已经被创建并且内容被放置在iframe中后添加沙盒属性(在src=属性中使用javascript: URI),但是iframe似乎保留了在页面加载时存在的属性。

当涉及应用沙盒属性时,Internet Explorer似乎与FireFox或Chrome的工作方式不同。当设置sandbox="allow-scripts"时,Chrome和FireFox将允许使用src=javascript:function()动态创建内容。IE在创建期间应用沙盒属性的唯一域,并认为src=javascript:function()不是同源的,因此不允许动态创建iframe内容。

我不确定您为什么要以编程方式添加沙盒属性,但如果问题只是尝试加载具有动态源的iframe,则可以使用srcdoc属性以及沙盒属性,唯一的问题是IE不支持srcdoc属性。

回答您的问题,我不认为可以在加载iframe及其内容之后添加沙盒属性,并使iframe表现为沙盒iframe。


0
请尝试这个fiddle:http://jsfiddle.net/yAwxy/ 当脚本在onLoad运行时,它不起作用,因为iframe已经在工作。 如果您尝试使用onDomready,则会应用沙盒,因为脚本尚未运行。 如果您使用此fiddle进行日志记录:
<iframe id="myFrame" srcdoc="<script>console.log('Executing script inside iFrame')</script>">
</iframe>

在脚本中

console.log('Executing script inside page')

当脚本 console.log('Executing script inside page') 被包装在 onLoad 中时,输出结果为:

Executing script inside iFrame 
Executing script inside page 

当在onDomready中包装时:

Executing script inside page 
Executing script inside iFrame 

另请参阅http://jsfiddle.net/yAwxy/1/

因此,要更改规则,必须在OndomReady中更改


抱歉,这不是我要问的。我想问的是是否可以切换沙盒安全属性并使浏览器接受它们。 - joseeight
抱歉,你还是没有理解问题所在。这不是关于改变属性值的问题,而是关于浏览器实际实现更改值和适当的沙盒安全措施,目前它们并没有这样做。这不是一个简单的问题,所以除非你熟悉HTML5沙盒技术,否则你很难理解。感谢你的尝试。 - joseeight
1
只是为了明确,如果您阅读MDN上的文章,可以通过编程方式更改沙盒属性,或者至少应该这样做,因为他们特别提到这是一种威胁。问题在于它不起作用,这意味着没有威胁,但是,在“加载”沙盒更改将不会被执行或允许的实现中没有提到,这似乎是Chrome和Firefox中的情况。 - joseeight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接