如何使Codeigniter CSRF保护与SSL一起正常工作?

时间:2012-07-24 16:53:59

标签: php codeigniter csrf ssl

我已启用CI CSRF保护,它可以正常使用http。打开https后(通过将网站的基本网址更改为https并将所有流量从http重定向到https),我开始看到:

csrf token is missing on request

日志中的错误。 Codeigniter在两种情况下报告此错误:

1)csrf令牌不在POST请求中 2)csrf令牌cookie未设置或已过期。

我们所有的帖子请求(主要是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

2 个答案:

答案 0 :(得分:0)

我会在这里抛出一个随机的答案,因为你提到了 AJAX 电话。我遇到CI CSRF保护的一些事情:

http://blog.biernacki.ca/2011/12/enabling-csrf-protection-in-codeigniter-for-ajax-calls/

因为 SSL 与您的CSRF工作无关。我甚至不认为它就是这样。您正在查看对非HTTPS端口的静态调用,或者在ajax调用时未将您的令牌传递给CSRF。

答案 1 :(得分:0)

可能是用户正在访问https://example.com,但请求正在POST https://www.example.com(反之亦然)。尝试a)将cookie_domain设置为“.example.com”;或b)创建.htaccess规则,将https://example.com的所有请求重定向到https://www.example.com