2012-09-20 166 views
0

我在這裏瘋了。我在我的腳本中提供了一個由ajax提交的表單:Yii CSRF令牌無法驗證

jQuery.ajax({ 
     url:jQuery('form',modal).attr('action'), 
     contentType: "application/json; charset=utf-8", 
     dataType: 'json', 
     type:'post', 
     data: { 
      email:jQuery('input[name="email"]',modal).val(), 
      something:jQuery('input[name="something"]',modal).val(), 
      level:jQuery('select[name="level"]',modal).val(), 
      YII_CSRF_TOKEN: jQuery('input[name="csrf"]').val() 
     }, 
     success: function(data){ 
      jQuery('.message',modal).html(data.message).slideDown(); 
      if (!data.success){ 
       jQuery('input[name="email"]',modal).addClass('error'); 
      } else { 
       jQuery('input[name="email"]',modal).removeClass('error'); 
      } 
     } 
    }); 

一切都很好。那麼今天我正在寫一個新的函數來刪除數據庫中的項目。所以我寫了我的PHP函數(沒有額外的複雜),並添加通過點擊鏈接觸發jQuery的AJAX調用它:

// ajax request 
    jQuery.ajax({ 
     url:jQuery(this).attr('href'), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     type:'post', 
     data: { 
      something:jQuery(this).attr('alt'), 
      YII_CSRF_TOKEN:jQuery('input[name="csrf"]').val() 
     }, 
     success: function(data){ 

     } 
    }); 

兩者的聯繫和形式都在同樣的觀點。但添加新的功能後刪除所有類型的崩潰。我無法向服務器發送任何POST請求,只是出現「錯誤:無法驗證CSRF令牌。」 。 我在通過CSRF時看不到問題。 Firebug的日誌顯示:

YII_CSRF_TOKEN bf6d9bf62ee96f32e34a74244baca7f2f1bdd569 
something 4 

我能明白,新的功能不以任何理由的工作,但爲什麼其他功能打破了爲好,我不能。

請幫忙

+0

[This](http://stackoverflow.com/questions/11153112/yii-error-400-the-csrf-token-could-not-be-verified-when-trying-to-delete-the-pos ) 可能有幫助。 – Vlad

+0

我相信你可以在firebug/firefox中跟蹤http請求/響應。確保cookie包含與表單相同的值。這意味着您可以找到一個名稱爲「YII_CSRF_TOKEN」並且應該與表單的「YII_CSRF_TOKEN」值匹配的cookie。 – SuVeRa

+0

@SuVeRa至少有人花了一秒鐘才真正想到這個問題,謝謝。不幸的是,你所說的一切,我嘗試/檢查cookie中的值是相同的,我ebeu試圖刪除它,但仍然是同樣的問題。有一些額外的字符在cookie看起來像編碼的網址(%20等),其中只有少數,我現在沒有在手,它可以嘗試跟蹤是什麼 – Tom

回答

0

我已經知道問題是什麼,想我會分享給你。當然這是非常微不足道的。

在PHP函數(行動)的流量去,每次它遇到的問題/不期望的結果(記錄不存在等),它會返回類似:

if (empty($user)){ 
    echo json_encode(array('success'=>0,'message'=>'User does not exist')); 
    return false; 
} 

我想你們中的一些人已經看到我的錯誤了。問題是,一旦你

return false; 

Yii自動返回消息「無效請求」。 因此,如果您在服務器端獲得或不是所有事情都做得很好,則必須始終返回true。所以

if (empty($user)){ 
    echo json_encode(array('success'=>0,'message'=>'User does not exist')); 
    return true; 
} 

按預期工作。

對於消息「錯誤:無法驗證CSRF令牌」的問題。我仍然不明白問題是什麼,但也找到了解決辦法。我意識到這個消息是在第一次使用$ _POST變量進行操作時返回的。因此,我在行動開始時所做的是:

$post = $_POST; 

可能不是完美的解決方案,但它的工作原理。

相關問題