Php 无法验证Yii CSRF令牌

Php 无法验证Yii CSRF令牌,php,ajax,post,yii,csrf,Php,Ajax,Post,Yii,Csrf,我的脚本中有一个由ajax提交的表单,如下所示: jQuery.ajax({ url:jQuery('form',modal).attr('action'), contentType: "application/json; charset=utf-8", dataType: 'json', type:'post', data: { email:jQuery('input[name="email

我的脚本中有一个由ajax提交的表单,如下所示:

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

我可能理解新函数由于任何原因都无法工作,但为什么其他函数也出现故障,我无法理解。

我已经找出了问题所在,并想与您分享。当然,这是非常琐碎的

在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令牌”的问题,我仍然不明白问题是什么,但也找到了解决方案。我意识到这个消息是在我使用$\u POST变量执行任何操作的第一个实例中返回的。因此,我在行动开始时所做的是:

$post = $_POST;

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

可能会有所帮助。我相信您可以在firebug/firefox中跟踪http请求/响应。确保cookies包含与表单相同的值。这意味着您可以找到一个名为“yi_CSRF_TOKEN”的cookie,该cookie应与表单的“yi_CSRF_TOKEN”值匹配。@SuVeRa至少有人花了一秒钟时间认真考虑了这个问题,谢谢。不幸的是,你说的一切我都试过了。cookie中的值相同,我尝试删除它,但仍然存在相同的问题。cookie中有一些额外的字符看起来像编码的url(%20等),只有少数字符,我现在手头没有,可以尝试跟踪这是什么