CodeIgniter CSRF不在子域上工作

时间:2015-05-28 22:07:57

标签: php codeigniter csrf

我正在使用CodeIgniter来运行我的应用程序,该应用程序分为两部分。基于example.com的“用户”部分和基于business.example.com的“业务”部分。使用用户部分时,当我使用form_open函数时,CSRF令牌会自动添加到表单字段中,但不会在业务部分中添加。

的config.php

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '.'.ltrim(rtrim($config['base_url'], '/'), 'http://'); //generates ".example.com"
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf';
$config['csrf_cookie_name'] = 'csrf';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = FALSE;
$config['csrf_exclude_uris'] = array();

1 个答案:

答案 0 :(得分:0)

作为临时解决方案,我冒险进入系统文件夹并更改了form_helper文件中的一些代码。第94行查找表单action等于基本网址(http://example.com),并未考虑子域(http://business.example.com)。更改了第94行:

if ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method="get"'))

if ($CI->config->item('csrf_protection') === TRUE && strpos($action, ltrim($CI->config->base_url(), 'http://')) !== FALSE && ! stripos($form, 'method="get"'))

基本上我已经修剪了" http://"从基本网址,我正在寻找" example.com"而不是" http://example.com"。我很想知道一个不涉及修改核心文件的解决方案。