Я хочу включить защиту csrf только в нескольких моих контроллерах, поэтому у меня есть
function __construct() { parent::__construct(); $this->load->library('form_validation'); $this->load->library('tank_auth'); $this->load->helper(array('form', 'url')); $this->load->model('user_model', '', true); $this->config->set_item('csrf_protection', TRUE); }
Но, похоже, это не сработает, хотя, когда я делаю var_dump ($ this-> config) на странице, он показывает, что csrf_protection имеет значение TRUE, но файлы cookie не установлены, а форма имеет скрытое поле без значения
<input type="hidden" name="ci_csrf_token" value="" />
Имя маркера Csrf и имя файла cookie все установлены, формы вызываются с помощью form_open ().
Любая помощь приветствуется.
Обновление: поэтому это невозможно из версии 2.1.1 из-за строки в конструкции класса безопасности, if (config_item('csrf_protection') === TRUE) {
Класс безопасности инициализируется перед контроллером, поэтому естественно, что изменение элемента конфигурации в контроллере не повлияет на него.
У меня есть решение для вас. Создайте собственное приложение / core / MY_Security.php и поместите в него:
<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' ); class MY_Security extends CI_Security { public function csrf_verify( ) { foreach ( config_item('csrf_excludes') as $exclude ) { $uri = load_class('URI', 'core'); if ( preg_match( $exclude, $uri->uri_string() ) > 0 ) { // still do input filtering to prevent parameter piggybacking in the form if (isset($_COOKIE[$this->_csrf_cookie_name]) && preg_match( '#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name] ) == 0) { unset( $_COOKIE[$this->_csrf_cookie_name] ); } return; } } parent::csrf_verify( ); } }
Это проверит следующие исключения, которые необходимо добавить в приложение / config.php в разделе CSRF:
$config['csrf_excludes'] = array ( '@^/?excluded_url_1/?@i' , '@^/?excluded_url_2/?@i' );
Каждый шаблон сопоставления будет исключен из проверки CSRF. Вы можете создать регулярное выражение здесь по адресу http://rubular.com
ура