为什么IE XDomainRequest不发送Referer头

时间:2013-10-14 07:00:37

标签: javascript internet-explorer cors http-referer xdomainrequest

当我通过XDomainRequest对象在IE中执行CORS时,不会发送Referer HTTP标头。有没有官方文件说明这个?我完全理解,依赖Referer HTTP头是基本错误的想法,但是没有确凿的证据我被困在这里,并且无法证明我们的架构师是错误的。

示例转储:

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

Chrome请求

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

3 个答案:

答案 0 :(得分:2)

Eric Law(前IE项目经理)在他的博客文章中回答了这个问题,因为预期的限制从IE8时代开始回归:

  

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

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

答案 1 :(得分:1)

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

答案 2 :(得分: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