Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数据URI方案与CORS_Javascript_Google Chrome_Firefox_Cors - Fatal编程技术网

Javascript 数据URI方案与CORS

Javascript 数据URI方案与CORS,javascript,google-chrome,firefox,cors,Javascript,Google Chrome,Firefox,Cors,我认为数据URI方案不是跨域请求,但我发现firefox和chrome的行为方式非常不同 我知道这样做有点奇怪。 问题不是为什么他妈的要你对一个数据做请求:text/json;,URI?,但这可能吗 Firefox有,chrome没有。根据,常规来源由三元组(uri方案、uri主机、uri端口)组成。由于数据URI方案与HTTP URI方案不同,并且它所描述的URI肯定不具有与web应用程序相同的主机和端口,因此数据URI的来源显然不同 我用php创建了一个示例代码: 在HTTP响应中返回a

我认为数据URI方案不是跨域请求,但我发现firefox和chrome的行为方式非常不同

我知道这样做有点奇怪。 问题不是为什么他妈的要你对一个数据做请求:text/json;,URI?,但这可能吗

Firefox有,chrome没有。

根据,常规来源由
三元组(uri方案、uri主机、uri端口)
组成。由于数据URI方案与HTTP URI方案不同,并且它所描述的URI肯定不具有与web应用程序相同的主机和端口,因此数据URI的来源显然不同

我用php创建了一个示例代码:
在HTTP响应中返回
aaa


发送
GEThttp://test.loc/
并在车身中显示
aaa
,如果未被CORS阻止

结果:
  • msie当前不支持数据URI
  • firefox始终显示
    aaa
  • chrome display
    aaa
    仅当我设置了
    访问控制允许源代码:null
    ,否则它会在沙箱中运行脚本,并对其隐藏XHR响应
结论: 目前只有chrome以适当的方式支持带有数据URI的CORS。我们应该向mozilla发送一封电子邮件,因为这是一个安全问题。在数据URI中发送的Javascript可以避免常规js筛选器

3年后:
根据我在Firefox上的bug报告,规范已经更改,所以他们修复了这个问题。因此,数据URI现在在每个受支持的浏览器上都需要allow origin标头。

在最后一句话中,您似乎已经回答了自己的问题。我想知道Firefox或Chrome哪一个做得正确。数据URI方案定义RFC 2397没有提及任何内容。AFAIK没有针对同源策略发布的标准,浏览器可以自由决定自己的规则。我阅读了您的mozilla问题,请提供您提到的chrome问题的链接,并更新您的答案。@user2284570什么chrome问题?你能引用我在哪里提到的吗?@user2284570我检查了我的邮件,过滤了“chrome”和“chrome”,但没有找到任何与此错误报告相关的内容。我想是我寄的,因为我是这么写的。顺便说一句,我认为这没关系,我在过去几年中报告了几个关于浏览器不一致性的错误,但所有这些错误都失败了,因为浏览器制造商不想相互沟通并解决它们。我认为这份报告的命运是一样的。由于这种态度,我不喜欢为客户开发,如果可以的话,我会尽量避免。后端要好得多。我可能会在客户端尝试WebGL:这就是像java小程序或flash player这样的技术如此成功的原因:同样的支持,无处不在。为所有设备编写一次代码;‑)。
$.get('data:text/json;,{"foo":"bar"}',function(data){
   alert(JSON.stringify(data));
})
aaa
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', "http://test.loc", true);
xhr.onreadystatechange = function (){
    if (xhr.readyState==4)
        document.body.innerHTML = xhr.responseText;
};
xhr.send();
</script>
<object
    data="data:text/html;base64,<?php echo base64_encode(file_get_contents('x.html')); ?>"
></object>