10

我的主页上有一个表单,设置为通过 XHR POST 提交到 URL https://mydomain.com/send_sms

当我在 Internet Explorer (http://mydomain.com) 中访问非 SSL 版本的主页并提交表单时,没有任何反应。在 Webkit 控制台中,我收到一个有用的错误说明Origin http://mydomain.com is not allowed by Access-Control-Allow-Origin.

然而,在 Firefox 13 中,请求清楚地提交 & a 返回 a 200 OK,尽管响应正文是空白的。此外,服务器端操作(发送短信)实际上是由 Firefox 请求触发的,而不是由其他浏览器触发的。

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

任何人都知道这是否是Mozilla在实施(甚至可能是疏忽)方面的一个有目的的差异?

4

2 回答 2

2

首先,http://example.comhttps://example.com是不同的起源。对于XHR 级别 1,这意味着不允许跨域请求。

但是对于当前的XHR (Level 2) ,它在支持CORS时支持跨域请求(服务器和客户端都支持!),跨域请求可以是

  • 一个简单的跨域请求,如果

    • 请求方法是GET, HEAD, or POST, and
    • 没有一个请求头字段不是Accept, Accept-Language, Content-Language, 或Content-Type, 和
    • 未设置预检标志

    或者

  • 需要 preflight的跨域请求,否则。

对于简单的跨域请求,允许浏览器发送请求。但是当收到响应时,需要检查服务器是否允许共享资源。这是检查Access-Control-Allow-Origin标头字段和其他Access-Control-*响应标头字段的地方。并且只有通过此检查,浏览器才允许脚本读取响应。

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

在您的情况下,观察到的行为可能有多种原因。我猜您的send_sms脚本只是不支持 CORS 的服务器端部分

于 2012-06-11T20:35:04.937 回答
0

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

我过去曾遇到过细微的差异,但这通常是在旧版 IE 中。

对我来说,firefox 的差异是一个错误(假设 vanilla 安装具有此特征)。不同的协议(HTTP vs HTTPS)相当于不同的来源,即使是同一协议的子域也被认为是不同的来源,所以FF13绝对不应该发出AJAX请求。

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

于 2012-06-11T19:05:10.097 回答