在隱藏表單字段中實現CSRF令牌是表單郵寄請求的CSRF的標準保護。CSRF對非形式郵寄請求的保護
但是,如何實現GET請求?或者ajax請求POST JSON數據而不是x-www-form-urlencoded請求正文?這些類型的事情是否都是按照特定情況處理的?
在隱藏表單字段中實現CSRF令牌是表單郵寄請求的CSRF的標準保護。CSRF對非形式郵寄請求的保護
但是,如何實現GET請求?或者ajax請求POST JSON數據而不是x-www-form-urlencoded請求正文?這些類型的事情是否都是按照特定情況處理的?
OWASP says this約CSRF和GET請求:
理想的解決方案是唯一包含在POST的CSRF令牌請求 和修改有狀態改變的影響只 響應POST請求的服務器端操作。事實上,RFC 2616對於GET請求要求 。如果敏感的服務器端操作保證 只響應POST請求,則不需要在GET請求中包含 令牌。
此外,OWASP筆記:
這種控制的許多實現包括挑戰令牌 GET(URL)的請求[...] ,而這種控制也有助於減輕CSRF的風險 攻擊,唯一的每個會話令牌暴露GET 請求。 GET請求中的CSRF令牌可能在幾個位置泄漏:瀏覽器歷史記錄,HTTP日誌文件,網絡設備 ,它們記錄HTTP請求的第一行,以及 引用標頭,如果受保護站點鏈接到外部站點。
這裏的麻煩是,如果用戶的令牌泄漏,您仍然是脆弱的 - 並且泄漏令牌非常容易。我不確定對於您的問題有一個很好的答案,不涉及將所有這些GET請求轉換爲POST請求。
值得注意的是,ASP.NET WebForms中的Viewstate功能的確提供了一些針對CSRF的保護,though it's very limited - 事實上,它也只保護回發請求。
爲了更簡單地說明這一點,您不應該使用GET請求作爲任何函數的入口點,這些函數除了返回瀏覽器呈現的只讀資源之外還有其他功能。所以不要有一個AJAX腳本對像transferMoney.aspx?fromAcct=xyz&toAcct=abc&amount=20
這樣的URL進行基於GET的調用。
HTTP規範states explicitly HTTP GET請求不應該有副作用。儘可能保持您的GET請求idempotent被認爲是最佳實踐。
我寫了關於保護ASP.NET MVC免於CSRF的an article,它闡述了一種將AntiForgeryToken
應用於POST控制器方法的實用方法。
這取決於您所應用的CSRF保護模式。首先,CSRF適用於端點更改狀態。如果您的GET請求更改狀態,那麼我建議您將它們修改爲POST。話雖如此,這是一個有效的觀點。
持久性標記的理想位置在AUTH標題中。這是FORM-POSTs,AJAX和GET請求中最低的共同點。您當然可以將令牌存儲在Cookie中,但在應用於多域網站時,此設計存在漏洞。
您可以在FORM-POST期間從隱藏字段解析令牌,而不會出現問題。改變這一點沒什麼意義。假設你GET請求與AJAX調用,您可以利用JQuery的ajaxSetup方法來自動插入令牌上的每個AJAX請求:
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", "TOKEN " + myToken);
}
});
有一個相對較新的模式獲得牽引力稱爲加密令牌模式。詳細說明here以及官方OWASP CSRF Cheat Sheet。還有一個名爲ARMOR的工作實現,它可以爲您提供您在各種類型的請求中尋找的靈活性。