2013-03-19 72 views
13

我們都會發佈一個AJAX請求到本地運行的服務器,即Chrome的加入Origin標以相同來源的請求

xhr.open("POST", "http://localhost:9000/context/request"); 
xhr.addHeader(someCustomHeaders); 
xhr.send(someData); 

那也正在從本地主機服務正在執行這個JavaScript的網頁:9000,即這完全看起來像一個同源的請求。

但是,由於某種原因,谷歌瀏覽器總是在生成的請求中設置一個Origin標頭,導致我們的服務器根據錯誤的假設,即CORS請求來阻止請求。

這不會發生在Firefox中。

另外,Firefox和Chrome都沒有發送OPTIONS預檢請求,這是令人困惑的;爲什麼在沒有首先進行初步檢查的情況下設置Origin頭部以確保服務器允許Origin和Custom頭文件?

有沒有人知道在這種情況下發生了什麼?我們是否誤解了CORS規範?

+0

請參閱http://seclab.stanford.edu/websec/csrf/csrf.ppt,它回答了爲什麼Origin標頭對同源POST請求有好處。這是一個CSRF保護機制。 – user239558 2014-05-13 08:53:17

回答

22

Chrome和Safari在同源POST/PUT/DELETE請求中包含Origin標頭(同源GET請求不會有Origin標頭)。 Firefox在同源請求中不包含Origin標頭。瀏覽器不會期望在同源請求上使用CORS響應標頭,因此對同源請求的響應會發送給用戶,無論它是否具有CORS標頭。

我建議您檢查Host標題,如果它與Origin標題中的域匹配,請不要將請求視爲CORS。標頭是這個樣子:

Host: example.com 
Origin: http://example.com 

注意Origin將有計劃(HTTP/HTTPS),域和端口,而Host只會有域名和端口。

+0

這很有道理 - 我們會根據需要更改CORS濾鏡。謝謝! – 2013-03-20 02:47:03

相關問題