Pregunta PHP MySQLI Prevención de Inyección SQL [duplicado]


Esta pregunta ya tiene una respuesta aquí:

Construí un sitio web que se lanzará pronto y solo tengo un par de preguntas sobre la prevención de la inyección SQL, entiendo cómo usarlo mysqli_real_escape_string pero me pregunto si tengo que usar eso en todas las variables que estoy obteniendo para mi declaración SQL y ¿tengo que usarlo cuando estoy haciendo sentencias select también o solo en Insertar actualización y eliminar? Además, ¿qué otra seguridad me recomendaría implementar antes de poner el sitio en funcionamiento, gracias de antemano por cualquier ayuda?


32
2018-04-29 15:08


origen


Respuestas:


Cualquier consulta puede ser inyectada ya sea de lectura o escritura, persistente o transitoria. Las inyecciones se pueden realizar al finalizar una consulta y ejecutar una separada (posible con mysqli), lo que hace que la consulta prevista sea irrelevante.

Cualquier entrada a una consulta desde una fuente externa, ya sea desde 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 lleva a una consulta parametrizada correctamente de la que puede crear una instrucció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 mysqli, puedes crear una declaración preparada usando prepare, une una variable (argumento) a un parámetro usando bind_paramy ejecuta la consulta con execute. No tiene 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:

  • Todas

38
2018-04-29 15:16



Se cerrará en segundos, pero solo para aclarar las cosas

Entiendo cómo usar mysqli_real_escape_string

Me temo que no lo eres.

si tengo que usar eso en todas las variables que obtengo para mi declaración de SQL

definitivamente no.
esta función debe ser utilizada para formatear cadenas de SQL solamente

¿Tengo que usarlo cuando estoy haciendo declaraciones selectas también o solo en Insertar actualización y eliminar?

ALGUNA Declaración de SQL. Pero, de nuevo, no "usando mysqli_real_escape_string" sino formateando sus literales completa y apropiadamente

Además, ¿qué otra seguridad recomendaría usted?

con respecto a la seguridad de SQL, debe formatear correctamente no solo las cadenas, sino también los literales de alguna tipo. Y cada uno requiere un conjunto distinto de reglas de formato


3
2018-04-29 15:09