Проблема с токеном Codeigniter CSRF - PullRequest
7 голосов
/ 05 июля 2011

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

Обнаружена ошибка. Действие Вы просили не допускается.

Я уже пробовал 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);

}

Ответы [ 6 ]

2 голосов
/ 13 марта 2012

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

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

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

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

2 голосов
/ 16 декабря 2011

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

$config['sess_cookie_name'] = 'mycookiename';
1 голос
/ 16 июня 2015

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

Изменить

$config['csrf_regenerate'] = TRUE;

на

$config['csrf_regenerate'] = FALSE;

Это останавливает регенерацию токенов CSRF при каждой отправке.

1 голос
/ 08 мая 2014
  • Вам необходимо обновить файлы безопасности ядра или просто взять код csrf из текущей версии codeigniter Файл защиты ядра codeigniter .

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

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

1 голос
/ 21 ноября 2011

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

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

<</p>

?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);
    }
}
1 голос
/ 07 июля 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...