Una inyección SQL es una consulta SQL formada de forma malintencionada que se utiliza para "confundir" una base de datos SQL para que proporcione algo que no debería. Por ejemplo, considere la siguiente consulta
"SELECT * FROM `users` WHERE `username` = '$name'";
En un caso normal, esto funcionará. Si enviamos 'Jack' a esto, devolverá todos los usuarios llamados Jack. Sin embargo, si un usuario ingresa y dice "' OR 1=1", la consulta resultante sería
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";
Dado que 1 siempre es igual a 1, y la cláusula de combinación es O, esto devolverá verdadero en cada fila, lo que a su vez mostrará CADA fila al usuario malintencionado. Usando esta técnica, alguien puede ver toda su base de datos. Considere también si alguien envía algo como "'; DROP TABLE users
";--, lo que resulta en
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";
Que son dos consultas, una que no hará nada, la segunda que eliminará TODA la base de datos de usuarios, lo que resultará en la pérdida de sus datos.
El mejor método para evitar las inyecciones de SQL es usar sentencias preparadas. Con estos, envía una consulta a la base de datos SQL que dice algo como
"SELECT * FROM `users` WHERE `username` = '?'";
Esto le permite a la base de datos conocer el formato de la consulta (DONDE el nombre de usuario equivale a algún valor), por lo que no hay confusión cuando se realiza una consulta de texto sin formato. Luego, la base de datos sabe esperar un valor y dónde colocarlo. Luego pasa ese valor a la base de datos que puede usar para buscar. Esto también es mejor ya que la base de datos puede optimizar la consulta para una búsqueda más rápida.
Lea las declaraciones preparadas, que explicarán esto con más detalle.