[Pregunta]: ¿Existe una vulnerabilidad de inyección en esta consulta?

Iniciado por Leguim, 7 Diciembre 2020, 21:08 PM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Hola,

uso las consultas "prepare" que tengo entendido ayudan a prevenir las inyecciones SQL, ahora bien también escuche que no es recomendable por este tema concatenar datos a una consulta.

No estoy del todo seguro si en este caso existe una vulnerabilidad de inyección:

Código (php) [Seleccionar]

class x
{
    static function Consulta($x, $y)
    {
           $con = Connection(username, password);
           $query = $con->prepare('SELECT x_campo, y_campo FROM x_tabla WHERE '.($x).' = '.($y));
           $query->execute();
   $results = $query->fetchAll();

   return $results;
    }
}


aclarar que tanto los parametros $x, como $y son constantes y no son datos que el usuario envía, un ejemplo:

Código (php) [Seleccionar]
$datos = x::Consulta('id_user', 61); // son constantes, no datos que un usuario ingresa

AlbertoBSD

Cita de: MiguelCanellas en  7 Diciembre 2020, 21:08 PM
aclarar que tanto los parametros $x, como $y son constantes y no son datos que el usuario envía, un ejemplo:

Código (php) [Seleccionar]
$datos = x::Consulta('id_user', 61); // son constantes, no datos que un usuario ingresa

Correcto no es vulnerable solo por esa parte, por que aseguras que son constantes.

Los prepare statements ayudan a prevenir los SQL injection si, si y solo si se utilizan como debe de ser, es decir  utilizando la funcion diseñada para pasar los parametros al sql statement bindParam()

De otra forma y tomando los datos directo del input del user si serian vulnerables.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Leguim

Hola,

Código (php) [Seleccionar]

// tendría esto...
$algo = 'algo';
$algo_2 = 'algo';

$con = Connection(username, password);
$query = $con->prepare('SELECT x, y FROM tabla WHERE x = :algo AND y = :algo_2');
$query->execute(array(':algo' => $algo,
                     ':algo_2' => $algo_2));
$results = $query->fetchAll();

return $results;

// lo pasaría a esto, correcto?...
$algo = 'algo';
$algo_2 = 'algo';

$con = Connection(username, password);
$query = $con->prepare('SELECT x, y FROM tabla WHERE x = :algo AND y = :algo_2');
$query->execute(array(':algo' => bindParam($algo),
                     ':algo_2' => bindParam($algo_2)));
$results = $query->fetchAll();

return $results;


Otra duda que me quedó es... entonces digamos que esas variables que había concatenado antes (arriba de todo, en el principio del tema) si no fueran constantes y si fueran datos que el usuario ingresa entonces SÍ habría una vulnerabilidad, no?

Gracias! (tardé en responder porque anduve bastante ocupado)

Danielㅤ

#3
Hola, todo dato ingresado por el usuario, tiene que ser sanitizado, nunca tenés que dejar pasar datos sin antes sanitizar, ni tampoco confiar en las restricciones que podes hacer desde javascript, eso serían solo avisos de que el usuario por ejemplo puede hacer tal cosa y tal otra no, PERO por detrás (del lado del servidor) se comprueba antes que lo que ingreso el usuario sea lo correcto.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!