2012-04-30 30 views
9

Hice un módulo llamado Galería que funciona bien en mi servidor local con la versión 2.0.3, pero cuando uso la versión 2.1.0 en un sitio remoto no puedo enviar un formulario y obtengo el error:La acción que ha solicitado no está permitida error

The action you have requested is not allowed.

¿Por qué es esto?

Respuesta

15

Es un error Codeigniter relacionado con la protección CSRF. Puede cancelarlo en cms/config/config.php

+12

Por supuesto, desactivar la protección CSRF significa que está abierto a los ataques CSRF. –

+0

Gracias, me ayuda mucho con un problema al intentar cargar archivos usando solicitudes AJAX, con Plupload y Codeigniter. – Lix

+7

Estoy de acuerdo con HighlyIrregular esto realmente no resuelve el problema, funciona a su alrededor y deja OP abierto a los ataques CSRF. JoeMoe1984 y Jhourlad Estrella tienen las mejores respuestas. No deberíamos alentar prácticas de codificación/desarrollo menos seguras. – jkinz

3

En cuestiones de programación, no se solucionan los problemas, lo arregla. Lo que quiero decir es que esta característica no estará aquí si no se puede usar: porque así es y me sirve. Usted acaba de tener un problema con la implementación.

Mi respuesta: Eliminar todos los guiones, puntos y otros caracteres no alfanuméricos partir de los valores de las siguientes entradas en application/config/config.php como se ve a continuación:

$config['sess_cookie_name'] = 'mycookiename'; //instead of "my_cookie_name" 
$config['csrf_token_name'] = 'mycsrftoken'; //instead of "my.csrf.token" 
$config['csrf_cookie_name'] = 'mycsrfcookie'; //instead of "my/csrf/cookie" 

Por cierto, guiones, pero a veces trabajan Sugiero usar palabras sueltas siempre que sea posible al nombrar valores de configuración. No, a menos que tenga el tiempo y las habilidades para estudiar los archivos centrales de Codeigniter relacionados con aquello en lo que esté trabajando solo para asegurarse de que sea seguro hacerlo.

De todos modos, espero que esto ayude a alguien por ahí a pesar de que mi respuesta es más de un año tarde.

23

Estoy de acuerdo con @Jhourlad Estrella en solucionar los problemas en lugar de deshabilitar una característica de seguridad, sin embargo, creo que el verdadero problema es con el campo de entrada oculto que contiene el token.

En lugar de utilizar HTML plano para crear un elemento de formulario, utilice las funciones auxiliares form_open() y form_close(). La razón es porque cuando usa la función auxiliar inserta automáticamente el token csrf como un campo oculto en el formulario.

Usted puede hacer esto manualmente, así añadiendo el token como un campo de entrada oculto en forma

<input type="hidden" name="csrf_hash_name" value="your-hash-value-here"> 

Hacerlo de esta manera le permitirá mantenerse protegido de los ataques CSRF y solucionar el problema que tiene .

Espero que esto ayude a alguien más ya que me estaba volviendo loco la primera vez que descubría esto.

+2

Esto debería marcarse como la respuesta correcta –

+1

@AaronBruce Sí, desafortunadamente respondí esto año tarde lol. Sin embargo, con suerte se hará notar lo suficiente. – JoeMoe1984

+4

Si no puede usar 'form_open()' o 'form_close()' puede obtener el nombre y el valor del token CSRF usando '$ this-> security-> get_csrf_hash();' y '$ this-> security-> get_csrf_token_name(); ' – jkinz

2

Tengo un formulario que se creó fuera de CI (en Joomla), pero que quería procesar con CI. Mi solución fue desactivar selectivamente csrf para referidores específicos. He añadido a esta configuración, directamente después de las opciones de configuración por defecto para csrf:

/* Set csrf off for specific referrers */ 
$csrf_off = array(
    "http://yourdomain.com/your-form-url", 
    "http://yourdomain.com/some-other-url" 
); 

if (isset($_SERVER["HTTP_REFERER"])) { 
    if (in_array($_SERVER["HTTP_REFERER"],$csrf_off)) { 
     $config['csrf_protection'] = false; 
    } 
} 

Esto desactiva la protección CSRF para las URL específicas de la matriz $ csrf_off, pero deja intacto para todas las demás solicitudes.

+0

Sé que es viejo, pero este enfoque me ayuda a resolver el problema del uso de CKEDITOR mientras está activado csrf. Gracias –

0

Utilice el formulario de CodeIgniter abridor de la siguiente manera:

<php echo form_open(url,method,attributes);?> 

ver CodeIgniter documentación de forma más.

0

Esto es probablemente un caso raro, pero no vi mi problema ya que mi servidor tiene muchos nombres de dominio diferentes que son muy similares.El problema era que estaba aterrizando en un dominio que estaba completamente mal, pero dado que "la acción que ha solicitado no está permitida". el error tiene prioridad sobre "Error 404 no encontrado" No pude verlo. Mi problema fue que no cambié mi base_url al dominio correcto. Entonces, si ninguna de las soluciones anteriores funciona para usted, puede verificar su configuración para $ config ['base_url'] en application/config.

1

Es una vieja pregunta pero este mismo problema me costó tanto tiempo que quería compartir cuál era el problema en mi caso. Puede ayudar a alguien.

Estoy usando Codeigniter 3.0.6 y CommunityAuth 3 junto con él y estaba recibiendo este error después de un inicio de sesión.

Era confuso, ya que el problema a veces podía suceder y otras veces no.

Mi 'base_url' en config.php de CI se estableció en algo así como 'www.mysite.com'

Al navegar por el sitio con 'mysite.com' (aviso 'www' no se encuentra en la dirección) y realiza un envío de formulario que usa la configuración 'base_url' de CI, como lo hace el inicio de sesión de CommunityAuth, luego falla el control CSRF y obtiene 'La acción que ha solicitado no está permitida'. error.

+0

Creo que una buena solución a este problema es elegir una dirección "preferida", ya sea con "www" o sin ella, y redirigir todo el tráfico a esa dirección preferida con htaccess. Además de resolver este problema, evitará que los motores de búsqueda indexen por separado el contenido de www y no de www, lo que puede perjudicar las clasificaciones de los motores de búsqueda. Mi reescritura se ve de la siguiente manera: '## REESCRIBE el tráfico www al dominio raíz' ' RewriteCond% {HTTP_HOST}^www \. (. *) $ [NC] ' ' RewriteRule^(. *) $ Http: // % 1/$ 1 [R = 302, L] ' (FYI - Parece que no puedo obtener saltos de línea para trabajar aquí - lo siento tan descuidado) – cmpreshn

0

IM usando CodeIgniter 3 mismo problema con

The action you have requested is not allowed.

Partiendo del punto de Isaac Pak, he cambiado de base_url a lo que Normalamente ha tecleado en la barra de direcciones. así ...

en vez de poner

http://www.domain.org

escribo de esta manera ..

http://domain.org

desde mi base_url() es sólo ..

$config['base_url'] = 'http://domain.org/';

las obras fix para mi sitio ...

0

Para mí el problema era que yo estaba cargando la vista en el índice, que he cambiado de la siguiente manera y funcionó:

public function index() 
{ 
    // Load Login Page 
    redirect('login/login_page','refresh'); 

} 

public function login_page() 
{ 
    $data['title'] = 'Login Page'; 

    $this->load->view('templates/header', $data); 
    $this->load->view('users/login_view', $data); 
    $this->load->view('templates/footer'); 
} 
0

Este error se produce por la csrf_show_error() en system/core/Security.php cuando el token CSRF en $ _COOKIE no coincide con su $ _POST ['csrf_token_name'].

Dentro config.php, I tuvo que garantizar que $config['cookie_domain'] emparejados $config['base_url'], sin el protocolo (es decir http(s)://).

De lo contrario, la cookie no se estaba pasando, lo que significaba que no se podía hacer la coincidencia.

0

he encontrado usando las funciones auxiliares de formulario

Ejemplo

<?php echo form_open('controller/function');?> 

<?php echo form_input('username', 'Username');?> 

<?php echo form_close();?> 

Uso de las funciones auxiliares como anteriormente debe dejar el mensaje de error CSRF muestra.

Si no uso echo form_input() si coloco solo la entrada normal, se desencadenará el error CSRF al volver a cargar.

<?php echo form_open('controller/function');?> 

<input type="text" name="username" /> 

<?php echo form_close();?> 

Así que recomiendo usar todas las funciones auxiliares ahora.

Cuestiones relacionadas