CodeIgniter CSRF 不适用于子域
CodeIgniter CSRF Not Working on Subdomain
我正在使用 CodeIgniter 运行 我的应用程序分为两个部分。基于 example.com 的 "user" 部分和基于业务的 "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();
作为临时解决方案,我冒险进入系统文件夹并更改了 form_helper
文件中的一些代码。第 94 行寻找等于基数 url (http://example.com) and does not take into account for sub domains (http://business.example.com) 的形式 action
。将第 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"'))
基本上我已经从基础 url 中删除了 "http://",我正在寻找 "example.com" 而不是“http://example.com”。我仍然很想知道一个不涉及修改核心文件的解决方案。
我正在使用 CodeIgniter 运行 我的应用程序分为两个部分。基于 example.com 的 "user" 部分和基于业务的 "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();
作为临时解决方案,我冒险进入系统文件夹并更改了 form_helper
文件中的一些代码。第 94 行寻找等于基数 url (http://example.com) and does not take into account for sub domains (http://business.example.com) 的形式 action
。将第 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"'))
基本上我已经从基础 url 中删除了 "http://",我正在寻找 "example.com" 而不是“http://example.com”。我仍然很想知道一个不涉及修改核心文件的解决方案。