Yii CSRF令牌不能被验证

问题描述 投票:0回答:1

在我的脚本中,我有一个通过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请求,只是出现 "Error: The CSRF token could not be verified". 我看不出问题所在,因为我正在传递CSRF。firebug日志显示。

YII_CSRF_TOKEN  bf6d9bf62ee96f32e34a74244baca7f2f1bdd569
something   4

我也许能理解新的函数因为任何原因而不能工作 但为什么另一个函数也坏了,我不明白。

php ajax post yii csrf
1个回答
1
投票

我已经知道问题出在哪里了,想和大家分享一下。当然这是很琐碎的问题。

在PHP函数(action)的流程中,每次遇到问题没有预期的结果(record doesn't exist等),它就会返回类似的东西。

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

我想你们中的一些人已经看到了我的错误。问题是,一旦你

return false;

Yii会自动返回 "Invalid Request".因此,不管你是否在服务器端做得很好,你都必须返回true。所以

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

按预期工作。

对于信息 "错误。The CSRF token could not be verified." (CSRF令牌无法验证) 我还是不明白问题出在哪里,但也找到了解决办法。我意识到,这个消息是在我第一次使用$_POST变量进行任何操作时返回的。因此,我在动作开始时做的是。

$post = $_POST;

可能不是完美的解决方案,但它是有效的。

© www.soinside.com 2019 - 2024. All rights reserved.