2010-04-12 68 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

相關問題