簡體   English   中英

Ajax 錯誤 403 禁止 CodeIgniter

[英]Ajax error 403 Forbidden CodeIgniter

我的 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 請求工作正常,服務器回答“添加”。 但是當我點擊鏈接 2 時,出現 403 錯誤。 更令人驚訝的是,當我點擊鏈接 2 上的第一個按鈕時,它可以工作,但鏈接 1 卻沒有。 我使用 codeIgniter。

知道為什么以及如何解決它嗎? 謝謝

由於您似乎正在使用 CSRF 令牌來驗證請求,因此任何發送無效令牌的請求都將被拒絕。

當您第一次單擊任一錨點時,您會用完該令牌。 因此,為了發出額外的請求,您需要在響應中取回一個新令牌並使用它而不是舊令牌。

您只需發送回您的數據值,在這種情況下為"add" ,以及您的 csrf 值: get_csrf_token_name()get_csrf_hash()

例如,您可以發回包含這些值的 JSON 值,而不是只發回純文本

腳本

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
        }, 

在第一次提交后 csrf 令牌不再有效,您有兩種選擇。

您可以在 config.php 中設置以下內容

$config['csrf_regenerate'] = FALSE;

或更新頁面上的 csrf 令牌。

對於 Codeigniter 4

首先,進入app/Config/Security.php

改變

public $regenerate = true;

public $regenerate = false;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM