2012-08-23 61 views
0

在隱藏表單字段中實現CSRF令牌是表單郵寄請求的CSRF的標準保護。CSRF對非形式郵寄請求的保護

但是,如何實現GET請求?或者ajax請求POST JSON數據而不是x-www-form-urlencoded請求正文?這些類型的事情是否都是按照特定情況處理的?

回答

1

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控制器方法的實用方法。

0

這取決於您所應用的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的工作實現,它可以爲您提供您在各種類型的請求中尋找的靈活性。