2012-09-20 119 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; 

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

相关问题