【问题标题】:Codeigniter 3.1.11 / Jquery (AJAX) doesnot pick up the value of csrf_cookie_name using $.cookieCodeigniter 3.1.11 / Jquery (AJAX) 不使用 $.cookie 获取 csrf_cookie_name 的值
【发布时间】:2021-09-23 13:41:44
【问题描述】:

我已经通过谷歌阅读了关于 stackoverflow 和其他文章的几个主题。我尝试了所有建议的方法,但是当我通过 Jquery 发出 AJAX 请求时,CSRF 对我不起作用。

Codeigniter 版本:3.1.11

JQuery 版本:2.1.4

JQuery Cookie 版本:1.4.1

config.php

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] =  BASEPATH . 'cache/';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = TRUE;
$config['cookie_httponly']  = TRUE;
$config['standardize_newlines'] = FALSE;
$config['global_xss_filtering'] = TRUE;
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'my_csrf_token';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
$config['compress_output'] = FALSE;
$config['time_reference'] = 'local';
$config['rewrite_short_tags'] = FALSE;
$config['proxy_ips'] = '';

不工作的 JQuery 代码

$.ajax({
    type: "post",
    url: "<?php echo base_url(); ?>" + "controllername/controllerfunction/parameter",
    data: {key1: val1, key2: val2, <?php echo $this->security->get_csrf_token_name();?> : $.cookie("<?php echo $this->config->item("csrf_cookie_name"); ?>") },
    success: function(res){
        if(res) {
            //do something
        }
    },
    error: function(res, status, error) {
        //do something
    }
});

我在网络标签中遇到错误

您请求的操作不被允许。

工作正常的是替换 AJAX 请求的数据部分

data: {key1: val1, key2: val2, <?php echo $this->security->get_csrf_token_name();?> : '<?php echo $this->security->get_csrf_hash();?>' },

但这会在我的网页源中显示 HASH VALUE,而且我无法从一个页面点击多个 AJAX 请求,因为 CI 会在每个 POST 请求上重新生成新的哈希

问题 1:

如何让这个$.cookie("&lt;?php echo $this-&gt;config-&gt;item("csrf_cookie_name"); ?&gt;" 工作?

问题 2: 如果我标记$config['csrf_regenerate'] = TRUE;,则只有1个AJAX请求在一个页面上有效,其他按钮拒绝工作,可能是因为CI在1次执行后创建了一个新的哈希,而页面仍然有旧的哈希。那么,如果我的问题 1 解决了,问题 2 会自动解决吗?


更新: 我发现设置 $config['cookie_httponly']= FALSE; 允许 Jquery 获取 cookie 值。

是否可以保持此设置为 TRUE 并仍然从 JQuery AJAX 获取 Cookie 信息?

【问题讨论】:

    标签: php jquery codeigniter security csrf


    【解决方案1】:

    由于您使用的是 Codeigniter 3.0 版,请在配置中更改:

    $config['csrf_regenerate'] = FALSE;
    

    这对我有用。

    【讨论】:

    • 感谢您的回复,但我希望保持安全性以确保应用安全
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多