2010-02-05 45 views
3

我試圖在symfony 1.4中使用jquery提交表單,但每次都會彈出CSRF攻擊檢測到的錯誤。這是我用來提交表格數據的代碼:使用ajax提交數據時檢測到CSRF攻擊

$.ajax({ 
     type: 'post', 
     cache: false, 
     url: $('#assign-form form').attr('action'), 
     data: (
     'activity[id]=' + $('#activity_id').val() + 
     '&activity[_csrf_token]=' + $('#activity__csrf_token').val() + 
     '&activity[assigned_to_user_id]=' + $('#activity_assigned_to_user_id').val() + 
     '&activity[assigned_to_group_id]=' + $('#activity_assigned_to_group_id').val() 
    ) 
}); 

我錯過了什麼嗎?

謝謝, 拉杜。

+0

可以粘貼您的表單的HTML代碼,也許應該處理表單的PHP? – 2010-02-05 22:36:14

回答

1

有一點需要注意的是,驗證輸入的Form對象是否與生成令牌的Form對象完全相同。默認情況下,該類用於生成CSRF令牌。

例如,如果您有一個表單的子類的實例用於生成表單html,然後發佈到使用祖先表單類的動作,那麼缺省情況下驗證很可能會失敗。

如果事實證明這是您的問題,可以重寫令牌創建。

此外,您是否已驗證令牌字段的值實際上是否包含令牌? console.log()可以幫助你發現這一點。

嗯......當我仔細觀察你的代碼時,需要考慮的另一件事是你要構建一個查詢字符串來傳入「數據」。你有沒有嘗試傳遞一個實際的JSON風格的對象?

+0

表單類是相同的。 以前從未使用JSON樣式的對象......我應該閱讀的任何文章才能入門? – 2010-02-06 16:00:04

+0

通過JSON樣式的對象,我只是指使用JavaScript對象來存儲鍵/值對。最終,$ .ajax()會將它轉換爲一個查詢字符串,但它可以使事情變得更可讀,更容易擴展。 以下是對上面的代碼可能是使用JSON式的對象時就像一個pastie: http://pastie.org/812536 關於JSON在那裏文章萬噸,但我不知道的明確的建議。然而,要熟悉JSON概念,最好的地方是http://json.org/ 乾杯。 – 2010-02-06 17:57:10

0

通常的原因是瀏覽器不接受cookies - 你有沒有檢查過cookie是否按預期返回(例如iehttpheaders,wireshark,tamperdata)?

你在settings.yml中配置了祕密嗎?

C.

+0

瀏覽器正在接受cookie。 是的,在security.yml配置爲: csrf_secret:42f41325ba2c6809722d2b164f954f74c1b82fdb – 2010-02-06 15:54:39

0

這個小問題讓我生氣過去。

如果它是可以接受的禁用對這種特殊形式CSRF保護(這往往是),你可以添加以下到您的Form類在/ lib /表格/ ...文件夾:

public function configure() 

    $this->disableLocalCSRFProtection(); 

我相信如果您不希望禁用CSRF,也可以爲表單的特定實例禁用CSRF,但我沒有嘗試過/沒有手頭的代碼。

+1

您可以使用下面的代碼在你的行動來禁用CSRF保護形式的特定實例: $形式=新建MyForm(); $ form-> disableLocalCSRFProtection(); – 2010-02-11 06:07:40

0

會話cookie是否真的用ajax查詢接收到它?服務器返回的會話cookie應該與普通的HTTP請求(例如啓動會話管理的第一個請求)以及XMLHttpRequest完全相同,否則您將在CSRF中遇到問題。

0

$( '#activity__csrf_token')。VAL()

您的意思是在該元素的id雙下劃線?