我們有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頭一個安全的方式來確定請求是否源於相同的域?
此外,正在刪除領先的協議:/ /從源顯示將始終產生相對於主機的適當的價值?
您是否認爲Origin頭部可能是假的威脅?它不應該是更可取的白名單IP地址和檢查請求的遠程IP地址而不是HTTP頭? – Stan
我們更關心無辜用戶的會話濫用CSRF攻擊,然後惡意用戶欺騙頭。在這種情況下,Origin頭文件不能僞造。所以這不是一個問題。 –
我來到同一個問題,你(見鏈接帖子)。在我看來,這種方法在避免CSRF時比白名單更清晰。還要注意,這個問題比AJAX的範圍更廣泛,比如Websockets – idelvall