IFRAME沙盒属性正在阻止AJAX调用
我有一个应用程序(IFRAME沙盒属性正在阻止AJAX调用,ajax,html,iframe,sandbox,same-origin-policy,Ajax,Html,Iframe,Sandbox,Same Origin Policy,我有一个应用程序(http://localhost/MyApp),其中一些部分通过iFrame渲染。这些iframed部分与应用程序DOM的其余部分没有任何关系,因此我应用了sandbox属性 IFRAME声明如下: <iframe src="/MyApp/en/html/action?id=1" sandbox="allow-forms allow-scripts" seamless="seamless"></iframe> 如果我将allow same origin
http://localhost/MyApp
),其中一些部分通过iFrame渲染。这些iframed部分与应用程序DOM的其余部分没有任何关系,因此我应用了sandbox
属性
IFRAME声明如下:
<iframe src="/MyApp/en/html/action?id=1" sandbox="allow-forms allow-scripts" seamless="seamless"></iframe>
如果我将allow same origin
添加到sandbox
属性中,它就可以工作了
为什么会这样?是否将路径/MyApp/en/html/action
视为整个IFRAME的来源,并将请求阻止到以前的级别
干杯。它影响Ajax的原因是Ajax受规则控制,当您对其进行沙箱处理时,实际上是在告诉浏览器将iframe内容视为来自不同的来源。引述同样的话:
- 唯一来源处理。所有内容都在唯一来源下处理。内容无法遍历DOM或读取cookie信息
沙盒
属性中省略允许相同来源
,它会将沙盒页面视为属于不同的域(事实上,它将视为具有null
来源)。由于将Ajax请求设置为null
没有意义,沙盒页面根本无法进行Ajax调用(如果允许将它们设置为localhost
,则它们将无法与父页面的调用区分开来,从而无法实现沙盒的目的)
附加信息
如果尝试对其他域进行Ajax调用,显然会失败:
<script src="http://code.jquery.com/jquery.min.js"></script>
<script>
console.log(location.host);
$.post('https://google.com/',{},function() { });
</script>
…如果您在不使用的情况下嵌入它,则允许使用相同的源代码
:
localhost
XMLHttpRequest cannot load https://google.com/. Cannot make any requests from null.
请注意,虽然两者都将location.host
报告为localhost
,但其中一个认为原点是http://localhost
,而另一个认为它是null
(显示您在示例中遇到的相同错误消息)
推理
为什么阻止来自同一域的沙盒内容的Ajax调用如此重要?如文章所述:
在某种意义上,相同域上的内容应该是安全的。这里的风险主要来自于在IFRAME中重新托管的用户生成的内容
让我们举个例子:假设Facebook决定允许用户在他们的页面上发布HTML5动画。它将它们存储在自己的服务器中,并且在显示时,沙盒将它们作为仅允许脚本
(因为动画工作需要脚本),但其他所有内容都被拒绝(特别是允许同源
,因为您不希望用户代码弄乱父页面)。如果默认情况下Ajax调用没有被阻止,会发生什么
Mallory创建的“动画”包括:
https://facebook.com
作为原点
src
img
元素时,浏览器将尝试正常加载“图像”,因为图像不受同源策略的约束
那么您的意思是,因为父帧使用主机A,即使子帧也使用主机A作为原点,它也将无法对其自己的原点执行AJAX,因为父帧正在使用它?这听起来像是一个古怪的实现,浏览器应该知道每个iframe执行哪些调用。浏览器知道,但服务器呢?如果服务器没有显式地向沙盒页面授予相同的源站权限,那么您如何知道它希望接收来自它的Ajax调用?如果您的服务器是,并且
iframe
中运行的代码来自不受信任的第三方,该怎么办?它们运行的域将是相同的,但这并不意味着第三方代码应该能够对服务器进行Ajax调用(可能泄漏敏感信息)。这是正确的设计,安全性方面。服务器不应该关心请求来自何处。实际上,阻止请求的是浏览器而不是服务器。对不起,我觉得这个问题有点奇怪。请检查我的最新答案。沙箱的全部意义在于否认所有不被明确允许的事情。因为浏览器不知道服务器关心什么和不关心什么,所以从安全的角度来看,它应该会出错,并假设Ajax调用(以及其他同源特权)不正常。如果你想从沙盒内容中接受Ajax,但又不想让它破坏父页面,恐怕你需要另一种策略,比如or。我想指出,向沙盒属性添加allow same origin标记实际上是没有用的
localhost
XMLHttpRequest cannot load https://google.com/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
localhost
XMLHttpRequest cannot load https://google.com/. Cannot make any requests from null.