CodeIgniter CSRF не работает на поддомене

1

Я использую CodeIgniter для запуска моего приложения, которое разбивается на два раздела. Раздел "пользователь", основанный на example.com, и раздел "бизнес", основанный на business.example.com. При использовании пользовательского раздела токен CSRF автоматически добавляется в поля формы, когда я использую функцию form_open но не в бизнес-разделе.

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();
Теги:
csrf
codeigniter

1 ответ

0
Лучший ответ

В качестве временного решения я отважился в системную папку и изменил код в файле form_helper. Строка 94 ищет форму action равным базовому URL (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://" из базового url, и я ищу "example.com" вместо " http://example.com ". Мне бы очень хотелось узнать решение, которое не связано с модификацией основных файлов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню