Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter CSRF在表单上失败_Php_Forms_Codeigniter_Csrf_Codeigniter 3 - Fatal编程技术网

Php CodeIgniter CSRF在表单上失败

Php CodeIgniter CSRF在表单上失败,php,forms,codeigniter,csrf,codeigniter-3,Php,Forms,Codeigniter,Csrf,Codeigniter 3,注意:这个问题不是关于AJAX请求失败,而是关于常规表单提交失败 我已使用以下config.php在CodeIgniter 3中启用了CSRF保护: 我正确地在表单字段中使用form_open,以便自动生成包含CSRF令牌的所需隐藏字段。然而,当我在我的网站上提交任何表格时,它会导致出现错误-您请求的操作是不允许的。错误 Cookie设置: $config['cookie_prefix'] = ''; $config['cookie_domain'] = ''; $config['cookie_

注意:这个问题不是关于AJAX请求失败,而是关于常规表单提交失败

我已使用以下config.php在CodeIgniter 3中启用了CSRF保护:

我正确地在表单字段中使用form_open,以便自动生成包含CSRF令牌的所需隐藏字段。然而,当我在我的网站上提交任何表格时,它会导致出现错误-您请求的操作是不允许的。错误

Cookie设置:

$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 2592000; // one month in seconds
$config['sess_save_path'] = 'ci_sessions';
$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'] = FALSE;
$config['cookie_httponly'] = FALSE;
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 2592000; // one month in seconds
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
另外,与大多数关于CI CSRF保护的问题相反,我的AJAX请求中的CSRF令牌通过向我的初始JavaScript中添加以下代码片段来正常工作:

function getCookie(c_name) { // A javascript function to get the cookie value
    if(document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if(c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if(c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
}

$.ajaxPrefilter(function(options, originalOptions, jqXHR){ // This function will attach "csrf_test_name" with all the request you are sending.
    if (options.type.toLowerCase() === "post") { // Required only if its a post method
        var csrf_token = getCookie("csrf_cookie_name");
        // initialize `data` to empty string if it does not exist
        options.data = options.data || "";

        // add leading ampersand if `data` is non-empty
        options.data += options.data?"&":"";

        // add _token entry
        options.data += "csrf_token_name=" + csrf_token;
    }
});

有没有办法让我的CSRF保护在表单字段中工作?此外,cookie中我的csrf\u cookie\u name值与隐藏HTML字段中的csrf\u token\u name值不同,这是应该发生的吗?

我多次遇到这个问题。这是困扰我的问题之一:。问题似乎在于,通过向某个控制器发出ajax请求,可以重新生成令牌,从而发送之前生成的令牌,因此导致了令牌不匹配。我通过禁用csrf_REGENATE解决了我的问题。我知道它不那么安全,但它可以让事情继续进行。

这是因为每次AJAX请求都会重新生成csrf令牌。您可以通过将$config['csrf\u regenate']选项设置为FALSE来解决此问题,或者可以使用jquery或javascript手动更新每个AJAX请求上的csrf令牌

检查本文的实施情况:


这也很好。

但是提交表单不是AJAX请求,对吗?@Stan:如果您正常提交表单,并且表单提交后重新生成整个表单,那么它不会导致任何问题。但确实如此。我正在使用一个正常的表单,表单_打开,以生成CSRF隐藏输入字段。正常提交,无需任何AJAX请求。仍然出现错误。是否使用表单帮助程序生成表单?你能粘贴你的表单HTML代码吗?是的,form_open来自form helper类。此处的HTML代码: