Windows 10、Codeigniter 3、jquery 3
我正在测试 ajax 函数,并且使用 $.post 函数将数据加载到 div 中,并将数据发送到读取文件并发回内容的 Controller 方法(我知道还有其他方法可以做到这一点,但是这是一个测试)。 ajax 调用如下所示
var btn = 'a[href="click-help"]'
$(btn).click(function(){
$.post(
base_url+'site/cal_help',
function(data){
$('.cal-help').html(data);
});
}
return false;
});
可以看到点击按钮不是一个表单而是一个链接。当我将 csrf 设置为 false 时,这可以正常工作,但如果启用了 csrf,控制台会显示调用为禁止。经过在线研究,我尝试按如下方式传递数据:
{
'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
},
但这没有帮助。如何在不将 csrf 设置为 false 的情况下修复它?如果我希望将其用于网站中的其他元素,我宁愿不这样做?
最佳答案
我仍在努力解决这个问题,并且发现了一些更有趣的事情:
尽管您可以像这样使用 Codeigniter Security 类:
<?php echo $this->security->get_csrf_token_name(); ?>
<?php echo $this->security->get_csrf_hash(); ?>
在 View 中并且这些函数可以工作,您还应该能够在脚本文件中使用它们,例如
var hash = '<?php echo $this->security->get_csrf_hash();?>';
console.log(hash);
这似乎适用于 View 中的脚本标记,但如果在单独的 script.js 文件中,控制台仅显示打印出来的代码。为什么会发生这种情况?
但是我深入研究了 js 字符串方法,发现以下方法可以检索哈希值:
//get all cookies
var x = document.cookie;
//search for the csrf cookie name
var posname = x.search('csrf_cookie_name');
//slice out hash itself which is always 32 characters long and these numbers work
var hash = x.slice(posname+17,posname+49);
console.log(hash);
建立了等于散列的变量后,您可以将以下数据添加到 ajax 调用中:
{
'csrf_test_name' : hash
},
我将所有内容都放在“click”函数中,以便它找到最新版本的 cookie。所以我最终得到了这样的结果:
var btn = '.btn-cal-help a';
$(btn).click(function(){
var x = document.cookie;
var posname = x.search('csrf_cookie_name');
var hash = x.slice(posname+17,posname+49);
//console.log(hash);
$.post(
base_url + 'site/cal_help',
{
'csrf_test_name' : hash
},
function(data){
$('.cal-help').html(data);
});
}
return false;
});
现在这对我有用(在我的本地服务器 - wamp 上),即使我也将“csrf_regenerate”设置为 TRUE。
关于jquery ajax调用被codeigniter 3 csrf禁止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523890/