jquery ajax调用被codeigniter 3 csrf禁止

标签 jquery ajax codeigniter

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/

相关文章:

javascript - 为每个第三个元素添加类并排除具有 X 类的元素

javascript - jQuery 在 .each 循环中获取输入值

javascript - 根据下拉列表 MVC 中的选择重新加载页面

php - CodeIgniter - 默认 Controller 不会自动加载

php - Codeigniter 中的链接不起作用

ID 更改时的 jQuery 动画

php - PFBC(Php 表单生成器类)可以提交 JSON 对象吗?

jquery getScript 函数永远不会失败?

javascript - Angular $http.json promise 返回错误,尽管我可以看到响应

php - 数据库中出现未录入数据的情况如何