我打开了CI CSRF保护,它可以很好地使用http。一旦我打开https(通过将网站的基本URL更改为https并将所有流量从http重定向到https),我开始看到:
csrf token is missing on request
日志中的错误。Codeigniter在两种情况下报告此错误:
1) csrf令牌不在POST请求中2) csrf令牌cookie未设置或已过期。
我们所有的post请求(主要是AJAX)都有一个csrf令牌,因为我们的自定义AJAX函数默认包含它,所以我认为它必须是#2。此外,我还尝试了配置,选择了安全和非安全cookie设置,在这两种情况下都会出现此错误。
我的猜测是csrf令牌cookie要么没有设置,要么没有加密。我的主要问题是,我无法在自己的系统(Ubuntu上的Chrome)上复制,但一旦我投入生产,我看到日志立即爆发。
关于我做错了什么,甚至如何调试这样的情况,有什么想法吗?谢谢
会话和Cookie配置:
$config['sess_cookie_name'] = 'session';
$config['sess_expiration'] = 1209600;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['cookie_prefix'] = "my";
$config['cookie_domain'] = "";
$config['cookie_path'] = "/";
$config['cookie_secure'] = myconfig('use_https'); //this is true when https
//is forced, false otherwise
我将在这里给出一个随机答案,因为您提到了AJAX调用。我在使用CI CSRF保护时遇到的问题:
http://blog.biernacki.ca/2011/12/enabling-csrf-protection-in-codeigniter-for-ajax-calls/
因为SSL与您的CSRF工作无关。我甚至不会认为是那样。您看到的是对非HTTPS端口的静态调用,或者在ajax调用时不传递CSRF的令牌。
可能是用户正在访问https://example.com,但请求是POSTing tohttps://www.example.com(反之亦然)。尝试a)将cookie_domain设置为".example.com";或b)创建.htaccess规则,该规则重定向https://example.com到https://www.example.com