PHP MySQLI Prevenir la inyección de SQL [duplicate]

3 minutos de lectura

He creado un sitio web que se lanzará pronto y solo tengo un par de preguntas sobre cómo prevenir la inyección de SQL, entiendo cómo usar mysqli_real_escape_string pero me pregunto si tengo que usar eso en todas las variables que obtengo para mi instrucción SQL y ¿tengo que usarlo cuando estoy haciendo declaraciones de selección también o simplemente al insertar, actualizar y eliminar? Además, ¿qué otra seguridad me recomendaría implementar antes de poner el sitio en vivo? ¡Gracias de antemano por cualquier ayuda!

  • Mi pregunta estaba relacionada con mysqli_real_escape_string la pregunta de la que hablas es sobre la inyección de SQL en general …

    – usuario2201765

    29 de abril de 2013 a las 15:28

  • Esta pregunta no debería haberse cerrado. Era específico de mysqli y no se responde en el enlace proporcionado por los censores.

    – JG Estiot

    21 de julio de 2015 a las 6:16

  • @JG Estiot – bien dicho, demasiados codificadores anales – el chico necesita ayuda – así que ayúdalo, a veces requiere menos esfuerzo responder que explicar por qué no quieres responder. Estoy de acuerdo contigo

    – Kerry

    17 de septiembre de 2016 a las 1:47

PHP MySQLI Prevenir la inyeccion de SQL duplicate
Píldoras de explosión

Se puede inyectar cualquier consulta, ya sea de lectura o escritura, persistente o transitoria. Las inyecciones se pueden realizar finalizando una consulta y ejecutando una separada (posible con mysqli), lo que hace que la consulta deseada sea irrelevante.

Cualquier entrada a una consulta desde una fuente externa, ya sea de usuarios o incluso interna, debe considerarse un argumento para la consulta y un parámetro en el contexto de la consulta. Cualquier parámetro en una consulta necesita ser parametrizado. Esto conduce a una consulta parametrizada correctamente a partir de la cual puede crear una declaración preparada y ejecutarla con argumentos. Por ejemplo:

SELECT col1 FROM t1 WHERE col2 = ?

? es un marcador de posición para un parámetro. Utilizando mysqlipuede crear una declaración preparada usando preparevincule una variable (argumento) a un parámetro usando bind_paramy ejecutar la consulta con execute. No tienes que desinfectar el argumento en absoluto (de hecho, es perjudicial hacerlo). mysqli hace eso por ti. El proceso completo sería:

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

También hay una distinción importante entre consulta parametrizada y declaración preparada. Esta declaración, mientras está preparada, no está parametrizada y, por lo tanto, es vulnerable a la inyección:

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

Para resumir:

  • Todos Las consultas deben parametrizarse correctamente (a menos que no tengan parámetros)
  • Todos los argumentos de una consulta deben tratarse de la forma más hostil posible sin importar su origen

  • sería bueno mostrar cómo usar estas declaraciones mágicas con la cláusula IN o SET con un número arbitrario de elementos. De lo contrario, sería más como un anuncio de televisión: fácil en la pantalla pero inutilizable en casa.

    – Tu sentido común

    29 de abril de 2013 a las 15:19


  • @YourCommonSense Creo que está un poco fuera del alcance de esta pregunta, pero tiendo a hacer algo como esta respuesta: stackoverflow.com/a/10698906/454533

    – Pastillas de explosión

    29 de abril de 2013 a las 15:22

  • ¡Gracias por la respuesta tan detallada! Esto parece una mejor solución que usar mysqli_real_escape_string Definitivamente investigaré un poco más sobre esto y luego lo implementaré. ¡Muchas gracias!

    – usuario2201765

    29 de abril de 2013 a las 15:23

  • no hay declaraciones preparadas de mysqli utilizadas en el tema que vinculó

    – Tu sentido común

    29 de abril de 2013 a las 15:25


  • @YourCommonSense, ¿es esto mejor? stackoverflow.com/questions/330268/…

    – Pastillas de explosión

    29 de abril de 2013 a las 15:27

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad