Intereting Posts
Логическая концепция и логика системы? Проведите массив рекурсивно и напечатайте путь ходьбы ошибка лотка 18 – передача закрыта с оставленными оставленными данными чтения simpleXML и акцентированные символы в PHP GDlib PHP – png to gif возвращает фон, прозрачный для черного Как добавить / установить изображения на шаблоне PHPOffice / PHPWord? прерывистый «Попытка присвоить свойство не-объекта» по запросам / неспособность установить свойства объекта через $ this перезагрузите страницу с помощью ajax, чтобы создать живой чат Запрос не отображается полностью доступный для пользователя размер файла Как печатать многомерные массивы в php Проверка номера телефона в США с помощью php / regex Встроенное расположение журнала ошибок сервера PHP Как вы устанавливаете переключатель CodeIgniter, прежде чем он находится в $ _POST? Получение элемента SimpleXMLElement для включения кодирования в вывод

Проблема маркера Codeigniter CSRF

Я сделал простой сайт регистрации / рассылки, но у меня есть странная проблема. Некоторые люди получают сообщение об ошибке

Произошла ошибка. Запрошенное действие не разрешено.

Я уже пробовал Google и обнаружил, что у людей такая же проблема, когда для CSRF установлено значение true. Тем не менее, я не встречаюсь со всеми, просто с небольшой группой людей. Я использую form_open и form_close, и я вижу скрытое поле (токен).

Я использую последнюю версию Codeigniter 2.0.2

Это мой контроллер

function __construct() { parent::__construct(); session_start(); } function index() { $this->load->model('beta_signup_model'); $this->form_validation->set_rules('mail','e-mail','required|valid_email|xss_clean|callback__mail_check'); // Check for errors if($this->form_validation->run() == FALSE) { // The system found a form validation error } else { // No errors found $_SESSION['mail_success'] = 1; $_SESSION['mail'] = $this->input->post('mail'); redirect(base_url() . 'confirm'); } ///// FILLS OUT INPUT FIELDS ///// // Loads field_populator_helper $this->load->helper('field_populator_helper'); // Defines input field names $input_names = array( 'mail', ); // Defines default values $default_values = array( 'Skriv inn e-posten din..', ); // Auto-populates fields with blur and focus $data['field_populator'] = populateFields($input_names, $default_values); $this->load->view('frontpage_view', $data); } 

Это может помочь изменить ваше «sess_cookie_name» в config.php, чтобы убедиться, что в нем нет пробелов или символов подчеркивания.

 $config['sess_cookie_name'] = 'mycookiename'; 

У меня была такая же проблема: полностью чистая инсталляция CI 2.1.0, на MAMP, и только после учебника в Руководстве пользователя.

После многого поиска и поиска в Google я обнаружил, что в «application / config.php» переменная $ config ['cookie_prefix'] всегда должна быть пуста, иначе, если включена защита CSRF, эта ошибка произойдет.

Возможно, что есть другие проблемы, например, библиотека сеансов, шифрование или защита XSS и т. Д., Но просто оставить «cookie_prefix» пустым, похоже, отсортировал его для меня.

Надеюсь, это поможет другим.

CSRF действителен, когда токен из скрытого поля совпадает с токеном из файла cookie. Проверьте четыре вещи:

  1. Не используйте собственные php-сессии (session_start и т. Д.). Переключитесь в класс сеанса в CI. http://codeigniter.com/user_guide/libraries/sessions.html

  2. Проверьте конфигурацию cookie в /application/config/config.php

  3. Проверьте значение токена в вашей форме, отличается ли оно от каждой обновления страницы?

  4. Возможно, попробуйте загрузить текущую версию CI с https://bitbucket.org/ellislab/codeigniter-reactor/downloads

Я использую свой собственный помощник csrf, потому что обнаружил, что при настройке параметра в config на true он играет хаос с моими вызовами ajax.

Я использую * xsrf_get_token_field () * для генерации поля и * xsrf_check_token () * как пользовательский обратный вызов в моей форме проверки.

<

 ?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); if ( ! function_exists('xsrf_get_token')) { /** * Get XSRF Token * * Returns a token that exists for one request that verifies that * the action was executed by the person that requested it * * @return string */ function xsrf_get_token() { $ci =& get_instance(); if ($ci->session->userdata('xsrf_hash')) { $token = $ci->session->userdata('xsrf_hash'); } else { // Generate the token $token = sha1(microtime().$ci->uri->uri_string()); // Set it in the session $ci->session->set_userdata('xsrf_hash', $token); } //Return it return $token; } } if ( ! function_exists('xsrf_get_token_field')) { /** * Get XSRF Token Field * * Returns an xhtml form element to include xsrf token. * You can specify the id/name attribute of the input. * Has a dependancy to get_xsrf_token(). * * @param string The id/name to be used * @return string */ function xsrf_get_token_field($name='auth_token') { return '<input type="hidden" id="'.$name.'" name="'.$name.'" value="' .xsrf_get_token(). '" />'; } } if ( ! function_exists('xsrf_delete_token')) { /** * Delete XSRF Token * * Deletes the xsrf token * * @return boolean */ function xsrf_delete_token() { $ci =& get_instance(); if ($ci->session->userdata('xsrf_hash')) { $ci->session->unset_userdata('xsrf_hash'); return TRUE; } else { return FALSE; } } } if ( ! function_exists('xsrf_check_token')) { /** * Get XSRF Token Field * * Checks that the token is still valid, returns true if so. * Deletes old token after valid or fail. * Has a dependacy to xsrf_delete_token() * * @param string The challenge token * @return boolean */ function xsrf_check_token($challenge_token) { // CI $ci =& get_instance(); // Get the stored token $token = $ci->session->userdata('xsrf_hash'); // Delete the old token xsrf_delete_token(); // Returns if the token is the right token return ($token == $challenge_token); } } 
  • Вам необходимо обновить основные файлы безопасности или просто взять csrf-код из текущей версии файла csignign codeigniter core secuirty .

  • Вы можете использовать ajax как: var cct = $("input[name=csrf_test_name]").val(); $.post(site_url + "user/update_product", { product_id: id , 'csrf_test_name': cct}) var cct = $("input[name=csrf_test_name]").val(); $.post(site_url + "user/update_product", { product_id: id , 'csrf_test_name': cct})

  • Codeigniter CSRF не регенерирует токен при обновлении страницы. Он будет регенерировать только на пост не на get. Тестеры безопасности обнаружили, что это уязвимость. Если какой-либо человек получил решение для этого, пожалуйста, поделитесь этим, он будет полезен для всех.

Для тех, кто использует Codeigniter 3.0, вы можете сделать следующее:

+ Изменить

 $config['csrf_regenerate'] = TRUE; 

в

 $config['csrf_regenerate'] = FALSE; 

Это останавливает токены CSRF, которые восстанавливаются при каждом представлении.