codeigniter 403错误 AJAX

t1qtbnec  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(196)

我的html页面上有两个链接:

<a id="1" onclick="like(this.id)">first</a>
<a id="2" onclick="like(this.id)">Second</a>

我的JS如下:

function like (id) {
    $.ajax({
        type:'POST',
        data: {
            func:
                'getNewLocations',
            '<?php echo $this->security->get_csrf_token_name(); ?>':
                '<?php echo $this->security->get_csrf_hash(); ?>',
            message:id
        },
        url:'<?php echo base_url();?>index.php/Category/like',
        success: function(result, statut) {
            if (result == 'add') {
                //do something
            }
            else if (result == 'remove') {
                //do something
            }
        }
    });
}

而PHP方法如下(仅为示例):

public function like() {
    echo 'add';
}

当我第一次点击链接1时, AJAX 请求正常工作,服务器回答“add”。但是当我点击链接2时,我有一个403错误。更令人惊讶的是,当我点击链接2的第一个链接时,它工作,但链接1不工作。我用codeIgniter工作。
你知道为什么和怎么解决吗?谢谢

ckx4rj1h

ckx4rj1h1#

由于您似乎正在使用CSRF令牌来验证请求,因此任何发送无效令牌的请求都将被拒绝。
当你第一次点击任何一个锚时,你就用完了那个令牌,所以为了发出额外的请求,你需要在响应中得到一个新的令牌,并使用它来代替旧的令牌。
您只需将数据值(本例中为"add")与csrf值一起发回:get_csrf_token_name()get_csrf_hash()
例如,您可以返回包含这些值的JSON值,而不是只返回纯文本
php脚本

function like(){
   $output = new stdClass;
   $output->csrfName = $this->security->get_csrf_token_name();
   $output->csrfHash = $this->security->get_csrf_hash();
   $output->data = "add";
   echo json_encode($output);
}

在JavaScript中

//Initial csrf values
var csrfName = '<?php echo $this->security->get_csrf_token_name();?>';
var csrfHash = '<?php echo $this->security->get_csrf_hash();?>';
function like (id) {
    //create data object here so we can dynamically set new csrfName/Hash
    var data = {
       func:'getNewLocations',
       message:id
    };
    data[csrfName] = csrfHash;

    $.ajax({
        type:'POST',
        data: data, 
        //dataType tells jQuery to expect JSON response
        dataType:"json",
        url:'<?php echo base_url();?>index.php/Category/like',
        success: function(result, statut) {
            if(result.csrfName){
               //assign the new csrfName/Hash
               csrfName = result.csrfName;
               csrfHash = result.csrfHash;
            }
            if (result.data == 'add') {
                //do something
            }
            else if (result.data == 'remove') {
                //do something
            }
        }
    });
}

请注意,如果您支持支持ECMAScript 2015的浏览器,则可以使用计算密钥在数据对象初始化程序中设置csrf值

$.ajax({
        type:'POST',
        data: {
            [csrfName]:csrfHash,
            func:'getNewLocations',
            message:id
        },
68bkxrlz

68bkxrlz2#

第一次提交后,csrf令牌不再有效,您有两种选择。
您可以在config.php中设置以下内容

$config['csrf_regenerate'] = FALSE;

或者更新页面上的CPRF令牌。

s1ag04yj

s1ag04yj3#

用于代码点火器4
首先,转到app/Config/Security.php
变更

public $regenerate = true;

结束日期

public $regenerate = false;

相关问题