¿Mi código utiliza mysqli_real_escape_string y quotes100% seguro contra Inyección de SQL?

1

Mi código es:

SELECT * FROM tlb_members WHERE username="{mysqli_real_escape_string($_GET['test'])}"

Estoy buscando y algunas personas dijeron que usar comillas en sentencias de SQL es seguro. ¿Es esto cierto?

    
pregunta Anh 07.03.2016 - 07:14
fuente

2 respuestas

6

No desinfectas adecuadamente el parámetro HTTP GET. La única manera buena de evitar la inyección de SQL es usar consultas parametrizadas.

Por favor, eche un vistazo a MeekroDB: enlace esto debería ayudarlo a crear consultas bastante seguras y para mí también es mucho más fácil de usar .

Tenga en cuenta que lo que hoy se considera lo suficientemente seguro, podría cambiar durante la noche. No hay cosas como el 100% de seguridad.

    
respondido por el Jeroen - IT Nerdbox 07.03.2016 - 07:28
fuente
5

Es casi seguro, excepto en algunos casos de esquina relacionados con ciertos juegos de caracteres . Aún así, no es el enfoque correcto.

Pero antes que nada, PDO con el valor predeterminado la configuración también sufre de los casos de esquina descritos anteriormente.

Todavía hay muy buenas razones para no hacerlo así:

  • teóricamente, tiene más sentido separar las entradas del usuario y las palabras clave SQL en lugar de escapar.
  • generalmente se recomienda a utilizar declaraciones preparadas, no para escapar . No siempre es bueno ir con recomendaciones generales, pero si vas en contra de ellas, deberías tener una buena razón para hacerlo.
  • es más difícil desordenar las declaraciones preparadas que las de escape, ya que debe hacerlo correctamente al enlazar los datos con la consulta, mientras que el escape puede tener lugar en cualquier lugar (y con frecuencia lo hace, para evitar la duplicación, etc.).
  • las declaraciones preparadas siempre usan el mismo enfoque, solo unen los datos. Con el escape, debes recordar tener comillas o convertir a int, dependiendo de los datos que tengas.
  • las citas son muy fáciles de olvidar y pasar por alto, especialmente en consultas más complejas.
  • Me parece que al usar declaraciones preparadas, te enfocas en la seguridad, mientras que al escapar, es más un pensamiento secundario que se interpone en el camino de la tarea que realmente quieres realizar, lo que hace que sea fácil de olvidar. para agregar escapes o citas solo una vez (no se puede olvidar de vincular las variables, ya que entonces no funcionaría).
  • las declaraciones preparadas son más fáciles de leer que el código que tiene mysqli_real_escape_string en todo el lugar.
  • es mucho más fácil encontrar puntos débiles en su código si usa declaraciones preparadas (solo grep para consultas que contienen variables).
respondido por el tim 07.03.2016 - 09:35
fuente

Lea otras preguntas en las etiquetas