Welcome Guest, Not a member yet? Register   Sign In
CSRF : Codeigniter / VueJs VIA JSON
#1
Question 

Hi,

We are currently using VUEJS here we had a "hickup" with the csrf protection from Codeigniter when sending json data instead of default 
form-data. After some researching we've found multiple articles that suggested to rewrite the csrf_verify function of the CI_Securtiy core class:

Example:
http://teknosains.com/i/how-to-ajax-csrf...-angularjs

But i'm not really a big fan of overriding core functions of CI.

I think there is a simpler solution (if you are only using post method)

PHP Code:
<?php

class MY_Security extends CI_Security
{
    public function csrf_verify()
    {
        /* Fill the $_POST since it is empty with data with php://input (decode json) */
        $_POST json_decode(file_get_contents('php://input'),true);
        
/* call parent csrf_verify function (now $_POST is not empty) */
        parent::csrf_verify();
     }



By just filling the $_POST variable (which is empty) with the decoded json from php://input and calling the csrf_verify() function  from the parent codeigniter CI_Security, you don't have to override the entire function and update the core of CI and not having to worry about missing changes in the csrf_verify() function.

Can someone verify my approach and that it's viable, so that users in the future struggling with this same issue can just find a quick solution in this post ... not having to waste several hours like we did.

Everything works as expected but I want to be sure this does not cause security holes, and thus giving people bad code.

Thanks in advance.
Bart
Reply
#2

(10-22-2019, 02:20 PM)bartMommens Wrote: Hola,

Actualmente estamos usando VUEJS aquí, tuvimos un "hickup" con la protección csrf de Codeigniter al enviar datos json en lugar de los datos de
formulario predeterminados  . Después de investigar un poco, encontramos varios artículos que sugerían reescribir la función csrf_verify de la clase principal CI_Securtiy:

Ejemplo:
http://teknosains.com/i/how-to-ajax-csrf-token-in-codeigniter-3- and-angularjs

Pero realmente no soy un gran fanático de las funciones principales de CI.

Creo que hay una solución más simple (si sólo está utilizando el método POST) con sólo rellenar la variable $ _POST (que está vacío) con el JSON decodificado de  php: // input y llamar a la  csrf_verify ()  la función  de la  matriz CodeIgniter 

PHP Code:
<?php

class MY_Security extends CI_Security
{
    public function csrf_verify()
    {
        /* Fill the $_POST since it is empty with data with php://input (decode json) */
        $_POST json_decode(file_get_contents('php://input'),true);
        /* call parent csrf_verify function (now $_POST is not empty) */
        parent::csrf_verify();
     }



CI_Security, no tiene que anular toda la función y actualizar el núcleo de CI y no tener que preocuparse por los cambios que faltan en la función  csrf_verify ().

¿Alguien puede verificar mi enfoque y que es viable, de modo que los usuarios en el futuro que luchan con este mismo problema puedan encontrar una solución rápida en esta publicación ... sin tener que perder varias horas como lo hicimos nosotros?

Todo funciona como se esperaba, pero quiero estar seguro de que esto no causa agujeros de seguridad y, por lo tanto, da a las personas un código incorrecto.

Gracias por adelantado.
Bart
Reply
#3

(This post was last modified: 11-06-2020, 11:26 AM by yealoaiza.)

Hola, la medida de extender la clase es muy adecuada, yo en la versión 3.1.6 de codeigniter agregué estas líneas para validar el JSON.

if ($ válido! == VERDADERO) {
    $ input_data = json_decode (trim (file_get_contents ('php: // input')), true);
    if (! $ input_data ||! isset ($ input_data [$ this -> _ csrf_token_name], $ _COOKIE [$ this -> _ csrf_cookie_name])) {
$ válido = FALSO;
    } else if (hash_equals ($ input_data [$ this -> _ csrf_token_name], $ _COOKIE [$ this -> _ csrf_cookie_name])) {
$ válido = VERDADERO;
    }
}
Reply




Theme © iAndrew 2016 - Forum software by © MyBB