Javascript 浏览器实现同源策略的方式是否存在实质性差异?

Javascript 浏览器实现同源策略的方式是否存在实质性差异?,javascript,ajax,security,cors,Javascript,Ajax,Security,Cors,我的主页上有一个表单,可以通过XHR POST提交到URL 当我在Internet Explorer中访问非SSL版本的主页时(http://mydomain.com)提交表单(&P),不会发生任何事情。在Webkit控制台中,我收到一个有用的错误,说明来源http://mydomain.com 访问控制允许源站不允许使用。 然而,在Firefox13中,请求明确提交&a返回一个200ok,尽管响应主体为空。此外,服务器端操作(发送SMS)实际上是由Firefox请求触发的,而不是由其他浏览器触

我的主页上有一个表单,可以通过XHR POST提交到URL

当我在Internet Explorer中访问非SSL版本的主页时(http://mydomain.com)提交表单(&P),不会发生任何事情。在Webkit控制台中,我收到一个有用的错误,说明
来源http://mydomain.com 访问控制允许源站不允许使用。

然而,在Firefox13中,请求明确提交&a返回一个
200ok
,尽管响应主体为空。此外,服务器端操作(发送SMS)实际上是由Firefox请求触发的,而不是由其他浏览器触发的

我一直认为同源策略甚至拒绝发送请求,但可能是浏览器从响应中接收数据是不允许的


有人知道这是否是Mozilla在实现上的故意差异(甚至可能是疏忽)?

应该禁止发送数据,就像禁止接收数据一样。例如,如果此页面上存在恶意JS,并且它正在将每次击键提交给某个随机服务器,该怎么办?在这种情况下,发送比接收更邪恶(顺便说一句,这实际上可以通过使用查询字符串请求图像或脚本等资源来实现,因为它们不受同源策略的约束)

我在过去遇到过一些细微的差别,但这通常是遗留IE的特点

对我来说,firefox的差异是一个bug(提供一个普通的安装具有这个特性)。不同的协议(HTTP vs HTTPS)相当于不同的来源,即使同一协议上的子域被认为是不同的来源,因此FF13绝对不应该发出AJAX请求


您没有设置CORS(跨源资源共享),FF13是您测试过的唯一支持它的浏览器?

首先,
http://example.com
https://example.com
是不同的来源。因为这意味着,不允许跨来源请求

但对于当前支持跨源请求(服务器和客户端都支持!)的系统,跨源请求可以是

  • a,如果

    • 请求方法是
      GET
      HEAD
      POST
      ,以及
    • 除了
      Accept
      Accept Language
      Content Language
      Content Type
      ,请求头字段中没有一个是其他字段
    • 未设置飞行前标志

  • a,否则

对于简单的跨源请求,允许浏览器发送请求。但是,当收到响应时,它需要。这是检查
Access Control Allow Origin
标题字段和其他
Access Control-*
响应标题字段的位置。只有通过了此检查,浏览器才允许脚本读取响应

对于其他跨源请求,需要预飞行来与服务器协商允许在实际请求中发送哪些信息。此飞行前请求基本上是一个
OPTIONS
请求,告诉服务器实际请求将包含什么(请求方法和头字段)。然后服务器可以决定是否允许这样的请求


在您的案例中,观察到的行为可能有多种原因。我猜你的发送短信脚本就是不行。

我确实可以在Firefox13中发出跨协议请求(至少http->https),但在google chrome中不行。我在一台甚至不发送CORS头的服务器上进行了测试。相关:CORS必须发送一个请求,以查看响应是否包含
访问控制允许来源
头,对吗?因此,请求已经发出,服务器可以按照自己的意愿进行处理,除非它将响应数据一起发送,否则它无法将响应数据返回到浏览器。这是一个Rails应用程序,此表单通过jQuery使用Rails的开箱即用
数据远程
功能。响应上没有CORS设置&No
Access Control Allow Origin
头(尽管有一个
Set Cookie
头,看起来很麻烦)。版本13是我测试过的唯一一款Firefox。任何特定于rails/Ruby的东西都不会对同一源代码策略产生影响,因为它是在浏览器级别强制执行的。所以你的技术堆栈应该是无关紧要的。如果您自己没有设置cookie,
set cookie
标题很可能是会话cookie。CORS的主要目的是不允许浏览器拒绝向跨源发送请求(这可以在没有XHR的情况下完成)但允许服务器拒绝向不允许共享资源的跨来源发送响应。回答得好!我对CORS的了解是有限的,所以很高兴有一个更深入的了解可以提供一些线索