2013-01-21 22 views
2

我們有RESTful JSON端點服務於AJAX請求,希望支持跨域資源共享。我們正在鎖定事情以確保我們不必擔心跨站點請求僞造(CSRF)攻擊。我們正在使用的部分方法是檢查是否存在Origin標頭,並驗證它是否包含在批准的Origins白名單中。但是,我們注意到一些瀏覽器(包括Chrome和Safari)包含帶有AJAX POST請求的Origin標頭,即使源自同一個域(因此不是CORS請求)。相同域請求的起源和主機標頭

由於我們寧願不要求我們的用戶必須將REST端點所服務的域列入白名單,因此我們希望自動確定給定請求是「同域」還是「跨域」 」。要做到這一點,現在我們最好的嘗試就是觀察Origin頭部是否存在,如果存在,請將它與Host頭部的值進行比較。我們的邏輯是,如果Origin匹配主機,那麼這個請求必須是「Same Domain」,所以我們不需要檢查白名單中的Origin。

這是我們正在考慮使用做到這一點的服務器端JS代碼片段:

 if (typeof (headers["Origin"]) !== "undefined" && 
     headers["Origin"].replace(new RegExp("^.*?//"), "") !== headers["Host"] && 
     !contains(allowedOrigins, headers.Origin)) { 
     return false; 
    } else { 
     return true; 
    } 

需要的正則表達式比較,因爲Origin標會在尋找這樣的:

http://localhost:8080 

而主機頭會在尋找這樣的:

localhost:8080 

所以我我們e表示正則表達式去掉領先的http://。

問題是我們還沒有看到任何其他使用或討論這種方法的實現。這與我們有關,也許這不是一個合適的方法,出於某種原因。所以,問題是 - 是比較主機頭與Origin頭一個安全的方式來確定請求是否源於相同的域

此外,正在刪除領先的協議:/ /從源顯示將始終產生相對於主機的適當的價值?

+0

您是否認爲Origin頭部可能是假的威脅?它不應該是更可取的白名單IP地址和檢查請求的遠程IP地址而不是HTTP頭? – Stan

+1

我們更關心無辜用戶的會話濫用CSRF攻擊,然後惡意用戶欺騙頭。在這種情況下,Origin頭文件不能僞造。所以這不是一個問題。 –

+0

我來到同一個問題,你(見鏈接帖子)。在我看來,這種方法在避免CSRF時比白名單更清晰。還要注意,這個問題比AJAX的範圍更廣泛,比如Websockets – idelvall

回答

2

我會建議你,而不是檢查阿賈克斯頭: X-要求 - 由於:XMLHttpRequest的

相同的起源阿賈克斯可以添加自定義頁眉和幾乎所有流行的框架如jQuery增加了X-要求,隨着:XMLHttpRequest。

但是,對於CORS,自定義標頭會引發預選的HTTP OPTIONS請求。因此,如果您看到X-Requested-With:XMLHttpRequest(或任何其他自定義標頭)而沒有預先發布,則您知道它是同源AJAX調用。

+0

John你的建議幾乎就是我們決定採用的路線。有趣的是,它很有趣。偉大的思想和所有這一切。謝謝! –

0

您當前與Origin標頭的主機頭比較確定相同的起源將失敗你想切換到HTTPS上下行或者我們可以在交叉協議請求的情況下說的方法。

就像你的代碼將這兩個起源一樣對待。

Origin : http://www.example.com Origin : https://example.com

其它方法將使用HTTP Referer。但我不會喜歡使用它,因爲欺騙它不是不可能完成的任務。

我的建議會比對不起更安全。在允許的來源列表中添加額外的項目不會給你太多的痛苦。

相關問題