我在我的網站上啓用了Codeigniter的CSRF保護,它使用AJAX提交用戶表單並處理需要通過AJAX提交數據的其他用戶交互。因此,我碰到了「不允許的操作」服務器端錯誤。我很快就發現只有通過AJAX收集和提交的數據才傳遞給服務器,因此CSRF代碼未被髮送。通過AJAX將Codeigniter CSRF字符串傳遞到服務器
生成的令牌標記的樣子:
<input type="hidden" name="csrf_test_name" value="dsflkabsdf888ads888XXXXXX" />
所以,在我看來提交令牌服務器進行驗證的最簡單方法是使用上csrf_test_name jQuery選擇得到的值,然後將這個以我的發佈數據爲服務器進行驗證。按下面的代碼:
//get CSRF token
var csrf = $('[name="csrf_test_name"]').val();
//build the form data array
var form_data = {
csrf_test_name: csrf,
... ... ...
... ... ...
}
//send the form data to the server so it can be stored
$.ajax({
type: "POST",
data: form_data,
url: ...,
dataType: "html",
success: function(msg){
... ... ...
}//end success
});//end ajax
我按照這個程序將數據發送到服務器,服務器端錯誤是固定的,一切工作正常每個Ajax提交。
爲了測試這個,我用一個不正確的CSRF令牌進行了硬編碼,服務器檢測到不一致並返回一個錯誤代碼500,這樣在表面上工作。
我的問題是,這是一個安全的方法來做到這一點,是否有一個預期的最佳實踐遵循?我已經做了一些谷歌搜索這個,似乎所有其他方法更復雜,我想知道如果我的方式創建一個我看不見/鍛鍊的攻擊媒介。
我使用與您一樣的確切方法,它通常是推薦的方法。 AFIK這是安全的,但我不介意更多的意見! – Motive 2012-07-06 22:13:07
這看起來很好,除非你在後端代碼中有一些邏輯上的缺陷,這很可能不太可能。我會確保你在不匹配時不會返回500錯誤,但我想這是一個優先選擇的問題。另外請記住,即使是最小的XSS也會在10箇中的任何一箇中擊敗任何csrf保護。 – 2012-07-07 13:15:05
感謝您的反饋。我使用的是Codeigniter,並且所有全球XSS過濾器都已打開,因此我應該理解Codeigniter文檔以應對大多數攻擊 – SimonBarker 2012-07-07 14:11:52