xss_clean is_ajax_request ip_address igniter example code php codeigniter frameworks token

php - ip_address - this-> input-> is_ajax_request()



Problema del token de CSRF de Codeigniter (6)

He creado un sitio sencillo de suscripción / boletín, pero tengo un problema extraño. Algunas personas reciben un error que dice

Se encontró un error. La acción que ha solicitado no está permitida.

Ya probé con Google y descubrí que las personas tenían el mismo problema cuando CSRF se configuraba como verdadero. Sin embargo, no le sucede a todos, solo a un pequeño grupo de personas. Estoy usando form_open y form_close y puedo ver el campo oculto (token).

Estoy usando la última versión de Codeigniter 2.0.2

Este es mi controlador

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); }


CSRF es válido cuando el token del campo oculto está haciendo coincidir el token de la cookie. Verifique cuatro cosas:

  1. No use sesiones nativas de php (session_start, etc.). Cambiar a clase de sesión en CI. http://codeigniter.com/user_guide/libraries/sessions.html

  2. Verifique la configuración de cookies en /application/config/config.php

  3. Compruebe el valor del token en su formulario, ¿es diferente cada actualización de página?

  4. Tal vez intente descargar la versión actual de CI desde https://bitbucket.org/ellislab/codeigniter-reactor/downloads


Uso mi propio csrf helper, porque he descubierto que al configurar la opción en la configuración en true, hace estragos en mis llamadas ajax.

Uso * xsrf_get_token_field () * para generar el campo y * xsrf_check_token () * como devolución de llamada personalizada en mi validación de formulario.

<

?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); } }


Puede ayudar a cambiar su ''sess_cookie_name'' en config.php para asegurarse de que no tenga espacios ni guiones bajos.

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


Tuve el mismo problema: instalar totalmente limpio de CI 2.1.0 en MAMP y seguir el tutorial en la Guía del usuario.

Después de mucho buscar y buscar en Google, encontré que en ''application / config.php'', la variable $ config [''cookie_prefix''] siempre debe configurarse como vacía; de lo contrario, si se activa la protección CSRF, se producirá este error.

Puede ser que haya otros problemas involucrados, es decir, biblioteca de sesión, cifrado o protección XSS, etc., pero el simple hecho de dejar el "cookie_prefix" vacío parece haberlo solucionado.

Espero que esto ayude a otros.


  • Debe actualizar los archivos de seguridad del núcleo o simplemente tomar el código csrf de la versión actual del archivo de seguridad del núcleo codeigniter codeigniter .

  • Puede usar ajax como: 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 no está regenerando el token al actualizar la página. Se regenerará solo en la publicación no en obtener. Los evaluadores de seguridad lo encontraron como una vulnerabilidad. Si alguna persona tiene solución para esto ... por favor compártala, será útil para todos.


Para cualquiera que use Codeigniter 3.0, puede hacer lo siguiente:

Cambio

$config[''csrf_regenerate''] = TRUE;

a

$config[''csrf_regenerate''] = FALSE;

Esto detiene la regeneración de tokens CSRF en cada envío.