Quitemos PHP por completo de la ecuación por un momento.
La inyección SQL permite que un atacante manipule la consulta SQL para que sea lo que él o ella quiere que la consulta ejecute. Esto puede ser volcar el contenido de la base de datos, modificar los datos e incluso ejecutar el código.
El ejemplo que proporcionó es, de hecho, vulnerable a la inyección de SQL. Para propósitos de demostración, déjame simplificarlo un poco:
mysqli_query($conn, "SELECT trans FROM dictionary WHERE word = '$search'");
Dado un valor de security
, la consulta resultante se verá así:
SELECT trans FROM dictionary WHERE word = 'security';
Esto es inocente y normal. Sin embargo, dado lo siguiente, un atacante puede obtener la versión de MySQL que está ejecutando:
' @@version -- -
Esto causaría que la consulta resultara en lo siguiente:
SELECT trans FROM dictionary WHERE word = '' @@version -- - ';
En última instancia, dependiendo de los permisos y la configuración, un atacante puede saltar de una base de datos a otra en su servidor de base de datos, leer archivos del sistema de archivos o ejecutar código. Este es un ejemplo de cómo un atacante puede leer archivos de un sistema operativo basado en Linux:
' LOAD_FILE('/etc/passwd') -- -'
Esto resultaría en la siguiente consulta:
SELECT trans FROM dictionary WHERE word = '' LOAD_FILE('/etc/passwd') -- -'
Hay un par de cosas a tener en cuenta en este momento:
- No todas las vulnerabilidades de inyección de SQL son iguales
- Las técnicas para leer archivos, ejecutar código y volcar bases de datos variarán ampliamente según el idioma, el servidor de base de datos back-end y las circunstancias que rodean a la propia vulnerabilidad.
Independientemente, recomiendo encarecidamente que se solucione una vulnerabilidad de inyección de SQL mediante la parametrización o la inclusión en la lista blanca de los comentarios de los usuarios según las necesidades de la funcionalidad en cuestión.
Comencé con la eliminación de PHP de la discusión porque la inyección de SQL no depende del lenguaje ni del marco, ya que afecta a cualquier idioma que permita la conectividad de la base de datos. Independientemente del idioma, las opiniones del usuario deben tratarse con sospecha y manejarse de manera adecuada.