[英]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.