Foros del Web » Programando para Internet » PHP » CodeIgniter »

Error 403 envio post a controlador

Estas en el tema de Error 403 envio post a controlador en el foro de CodeIgniter en Foros del Web. Hola, estoy usando la versión 3 de este framework y me encuentro con un problema. Tengo unos registros con la opción de ir eliminandolos uno ...
  #1 (permalink)  
Antiguo 31/07/2015, 10:02
Avatar de wolfmoon  
Fecha de Ingreso: octubre-2007
Mensajes: 189
Antigüedad: 16 años, 5 meses
Puntos: 2
Error 403 envio post a controlador

Hola,

estoy usando la versión 3 de este framework y me encuentro con un problema. Tengo unos registros con la opción de ir eliminandolos uno a uno.

Envio el id a través del metodo post al controlador pero me sucede una cosa. El primer registro que elimino se borra perfectamente, a partir de ahi los siguientes me arrojan un error 403.

En el controlador simplemente recojo la variable y la envio al modelo.

En el script:

Código Javascript:
Ver original
  1. $.post('url', { id: id }, function( response ) {
  2. console.log(response);
  3. }, 'json' );

A que puede ser debido?
  #2 (permalink)  
Antiguo 01/08/2015, 11:18
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 6 meses
Puntos: 6
Respuesta: Error 403 envio post a controlador

Hola,

Eso se debe a que tienes activado el CSRF de seguridad entonces al enviar un formulario por POST a otra página deberías usar el helper de formularios de codeigniter en el que automáticamente te da un token de seguridad para acceder. Este Token tienes que recargarlo en cada petición de Ajax.

Creo que me explico, si tienes alguna duda avísame.

Un abrazo
  #3 (permalink)  
Antiguo 03/08/2015, 11:16
Avatar de wolfmoon  
Fecha de Ingreso: octubre-2007
Mensajes: 189
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Error 403 envio post a controlador

Hola, gracias por la respuesta.

Había leido sobre el token de seguridad, y si que probe el siguiente codigo y no me funciono:

Código Javascript:
Ver original
  1. <!-- head -->
  2. <script type="text/javascript">
  3.     var csrf_value = '<?php echo $this->security->get_csrf_hash(); ?>';
  4. </script>
  5.  
  6. <!-- Update AJAX code, change csrf_test_name as needed -->
  7. <script type="text/javascript">
  8. $.post( ajax_url, { data: 'value', 'csrf_test_name': csrf_value }, function( response ) {
  9.     // response
  10. }, 'json' );
  11. </script>

Pero si la petición es ajax y la página no se recarga entiendo que el token siempre sera el mismo no?
  #4 (permalink)  
Antiguo 05/08/2015, 17:13
 
Fecha de Ingreso: febrero-2006
Mensajes: 155
Antigüedad: 18 años, 2 meses
Puntos: 6
Respuesta: Error 403 envio post a controlador

El csrf se generá en cada petición, hay una larga discusión en los foros en inglés en relación a esto, algunos optan en no usar csrf, otros en desactivarlo para peticiones ajax, y otros en ingeniárselas para generar y obtener el csrf en cada petición.

En mi caso, me ha traído sólo dolores de cabeza, y con el dolor de mi corazón (y de mi seguridad) lo desactivo por defecto.

Slds!
  #5 (permalink)  
Antiguo 18/08/2015, 18:42
 
Fecha de Ingreso: septiembre-2013
Ubicación: Madrid
Mensajes: 59
Antigüedad: 10 años, 6 meses
Puntos: 6
Respuesta: Error 403 envio post a controlador

Hola,

El problema es que la solución no es esa, el código de CSRF como ha dicho manOl0 se genera tras cada petición al servidor a través de POST. Lo que deberías hacer es en el controlador donde vaya la petición axaj (el de ajax_url) devolver mediante un echo lo siguiente:

Código PHP:
Ver original
  1. 'csrf' => $this->security->get_csrf_hash()
  2. ));

Y mediante el ajax en success o en la función de respuesta cambiar el valor del input hidden de seguridad oculto en el formulario por el nuevo.

Creo que se me entiende, si no, avísame y te pongo un ejemplo "entero".

Un abrazo

Etiquetas: 403, controlador, post
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:42.