是的,客戶端解決方案根本無關緊要。 CSRF是一個服務器端漏洞,如果不受保護,對服務器狀態(數據,基本上,但也包括登錄,特權級別更改等)的任何調用都易受CSRF影響。
在AJAX請求中,您必須自己發送令牌。使用jQuery,您可以使用$.ajaxSetup()
和beforeSend
鉤子來捕獲任何狀態鏈接請求並自動添加令牌(這通常適用於POST,但如果應用程序使用GET來更改內容,則它可以是PUT,DELETE,甚至GET) 。使用beforeSend
的好處是你只需要做一次,不需要再記住它。這種情況下的令牌通常可以在@Html.AntiforgeryToken()
的頁面中生成,JavaScript可以從那裏獲取。
稍微有點特殊的情況是當您發送json數據時(請求的內容類型爲application/json
且它不是www-url編碼的)。標準屬性[ValidateAntiForgeryToken]
不能從json獲取令牌(並且它也不能從請求頭獲取它,如果您決定這是傳遞它的最佳選擇)。在這種情況下,您可以實現自定義驗證屬性,但這很容易,您只需實現從何處獲取令牌,但對於實際驗證,仍然可以使用標準AntiForgery.Validate()
方法。
感謝很多很好的解釋,它是有道理的(y) – maces