8

当我通过 XDomainRequest 对象在 IE 中执行 CORS 时,未发送 Referer HTTP 标头。是否有任何官方文档涵盖此内容?我完全理解,依赖Referer HTTP header 基本上是错误的想法,但是没有确凿的证据我被困在这里,并且无法证明我们的架构师是错误的。

转储示例:

IE 请求

GET http://example.com/some/url HTTP/1.1
Accept: */*
Origin: http://another.domain.com
Accept-Language: sk-SK
UA-CPU: AMD64
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)
Host: example.com
Connection: Keep-Alive
Pragma: no-cache

铬请求

GET http://example.com/some/url HTTP/1.1
Host: example.com
Connection: keep-alive
Origin: http://another.domain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36
Accept: */*
Referer: http://another.domain.com/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: sk-SK,sk;q=0.8,cs;q=0.6,en-US;q=0.4,en;q=0.2
4

3 回答 3

2

Eric Law(前 IE 项目经理)在他的博客文章中回答了这个问题,正如预期的限制来自 IE8 时代:

我们希望确保 XDomainRequest 对象不会允许攻击者发出 HTML 表单无法发出的请求。这很重要,因为 Access-Control-Allow-Origin 标头在返回响应之前不可用,因此在发出请求之前无法判断服务器是否愿意接受跨域 HTTP 请求。如果没有这些限制,即使服务器没有返回 Access-Control-Allow-Origin 标头,也可能会针对旧服务器发生“即发即弃”CSRF 攻击

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

于 2014-02-16T14:08:24.873 回答
1

跨域请求(“XDR”)是匿名的,以保护用户数据。这意味着服务器无法轻易确定谁在请求数据。为了保护用户隐私,请使用既不敏感也不可识别个人身份的跨域数据进行响应。为帮助防止 Intranet 数据泄露到恶意 Internet 站点,我们不鼓励 Intranet 站点提供 XDR 数据。因此 IE 有时会因为安全原因阻止 XDomainRequest 对象。

于 2013-10-23T10:25:56.160 回答
0

根据微软自己的页面,可以使用这个新对象来避免这个问题:

/ / 1. Create XDR object
XDomainRequest xdr = new ();

/ / 2. Open the connection to the server using the POST method
xdr.open ("POST", "http://www.example.com/xdr.txt");

/ / 3. We send information to the server
xdr.send ("data to be processed");

根据 W3C,你可以使用这个

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.example.com/.../datos.php", true);
xhr.onreadystatechange = function(){
  if ( xhr.readyState == 4 ) {
    if ( xhr.status == 200 ) {
      document.body.innerHTML = "Reply: " + xhr.responseText;
    } else {
      document.body.innerHTML = "ERROR";
    }
  }
};
xhr.send(null);

还有一个 IE8 和 IE9 的库,以避免这个问题,但你应该使用 jquery Ajax https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

于 2013-10-23T10:32:31.340 回答