2012-07-06 94 views
0

我在我的網站上啓用了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,這樣在表面上工作。

我的問題是,這是一個安全的方法來做到這一點,是否有一個預期的最佳實踐遵循?我已經做了一些谷歌搜索這個,似乎所有其他方法更復雜,我想知道如果我的方式創建一個我看不見/鍛鍊的攻擊媒介。

+0

我使用與您一樣的確切方法,它通常是推薦的方法。 AFIK這是安全的,但我不介意更多的意見! – Motive 2012-07-06 22:13:07

+0

這看起來很好,除非你在後端代碼中有一些邏輯上的缺陷,這很可能不太可能。我會確保你在不匹配時不會返回500錯誤,但我想這是一個優先選擇的問題。另外請記住,即使是最小的XSS也會在10箇中的任何一箇中擊敗任何csrf保護。 – 2012-07-07 13:15:05

+0

感謝您的反饋。我使用的是Codeigniter,並且所有全球XSS過濾器都已打開,因此我應該理解Codeigniter文檔以應對大多數攻擊 – SimonBarker 2012-07-07 14:11:52

回答

1

更簡單的方法是將該csrf傳遞給$.ajaxSetup(),這種方式隨後包含在任何$.ajax()請求中。

var csrf = $('input[name="csrf_test_name"]').val(); 
var data = {}; 
data[CSRF] = csrf; 

$.ajaxSetup({ 'data': data }); 

然後在安裝後無需在請求中包含data: { csrf_test_name: 'xxx', ... }

2

我喜歡將它添加到Ajax設置。設置一次,讓它自動將它添加到您的所有請求的發佈數據。

$.ajaxSetup({ 
    data: { 
     csrf_test_name: $("input[name='csrf_test_name']").val() 
    } 
}); 
相關問題