2010-04-12 45 views
47

我想实现简单的xhr抽象,并且在尝试为POST设置标头时得到此警告。我认为这可能与设置标题在单独的js文件中有关,因为当我将它们设置在.html文件中的<script>标记中时,它工作正常。 POST请求工作正常,但我得到这个警告,并且很好奇为什么。我收到了content-lengthconnection标题的警告,但只能在WebKit浏览器(Chrome 5 beta和Safari 4)中使用。在Firefox中,我没有收到任何警告,Content-Length头部设置为正确的值,但Connection设置为keep-alive而不是close,这让我认为它也忽略了我的setRequestHeader调用并生成它自己的。我没有在IE中试过这段代码。下面是标记&代码:WebKit“拒绝设置不安全的标头'content-length'”

test.html

<!DOCTYPE html> 
<html> 
    <head> 
     <script src="jsfile.js"></script> 
     <script> 
      var request = new Xhr('POST', 'script.php', true, 'data=somedata', function(data) { 
       console.log(data.text); 
      }); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

jsfile.js

function Xhr(method, url, async, data, callback) { 
    var x; 
    if(window.XMLHttpRequest) { 
     x = new XMLHttpRequest(); 

     x.open(method, url, async); 

     x.onreadystatechange = function() { 
      if(x.readyState === 4) { 
       if(x.status === 200) { 
        var data = { 
         text: x.responseText, 
         xml: x.responseXML 
        }; 
        callback.call(this, data); 
       } 
      } 
     } 

     if(method.toLowerCase() === "post") { 
      x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
      x.setRequestHeader("Content-Length", data.length); 
      x.setRequestHeader("Connection", "close"); 
     } 

     x.send(data); 
    } else { 
     // ... implement IE code here ... 
    } 
    return x; 
} 
+0

为什么不让WebKit设置该标题字段? – Gumbo 2010-04-12 17:39:01

+0

我想我的印象是,最好的做法是设置该字段,以便在不同浏览器间保持一致... – 2010-04-12 17:40:55

+4

有一些标题字段应该可以更好地由客户端/服务器自动设置。 * Content-Length *就是其中之一。 – Gumbo 2010-04-12 17:42:46

回答

63

它也无视我setRequestHeader调用和产生它自己的

是, standard说,它必须:

出于安全原因,如果头是[...]

  • 连接
  • 内容长度

弄乱这些步骤应该被终止与这些可能会暴露各种request smuggling攻击,所以浏览器始终使用自己的值。没有必要也没有理由尝试设置请求长度,因为浏览器可以根据您传递给send()的数据长度来准确执行此操作。

+3

特别是书籍,学习PHP,MySqL和JavaScript,仍然教人们手动执行此操作...在阅读该书后,我做了同样的事情。 – 2012-06-13 17:50:43

+0

我需要setRequestHeader解压缩.gzip文件...这是合法的吗? – 2012-06-13 17:51:31

+0

@Hiro:你想要设置什么标题?一个HTTP请求通常不会为你解压一个.gzip资源;有gzip Content-Encoding来压缩线路上的资源,但浏览器会自动为你做这件事,它不是你需要(或可以)用'XMLHttpRequest.setRequestHeader'控制的东西。 – bobince 2012-06-13 22:49:23

相关问题