¿Esta construcción de SQL es propensa a la Inyección de SQL?
Nota: cualquier back-end de SQL es válido para ejemplos (Oracle, SQL Server, MySQL, Postgres), aunque para mis ejemplos estoy utilizando MySQL para probar.
Me preguntaba si la siguiente construcción es propensa a la inyección de SQL:
SELECT
campo1,
campo2,
%s
FROM
tbl
Y el usuario puede ingresar una cadena sin formato allí. No me importa permitir una entrada incorrecta, pero quiero ver si el usuario puede hacer algo perjudicial con esto, siempre y cuando elimine ciertos caracteres, como ;
. Así que si el usuario intentara hacer esto:
SQL % ('DROP TABLE usuarios; ')
La consulta SQL simplemente se convertiría en una consulta SQL inválida pero no necesariamente maliciosa:
SELECT
campo1,
campo2,
DROP TABLE usuarios
FROM
tbl
Pero si tenemos un usuario genio capaz de componer cualquier cadena aquí, ¿sería esto seguro frente a una inyección de SQL maliciosa? Y si no lo es, ¿cuál sería un ejemplo de cadena que se utilizaría para hacerlo?
davy.ai
La construcción anterior no es segura contra la inyección de SQL ya que el usuario puede potencialmente ingresar una cadena que altere el comportamiento previsto de la consulta de SQL. Incluso si se eliminan ciertos caracteres como los punto y coma, todavía hay formas en las que un usuario malintencionado puede manipular la cadena de entrada para ejecutar comandos de SQL arbitrarios.
Por ejemplo, considera la siguiente cadena de entrada:
Esto resultaría en la siguiente consulta de SQL siendo ejecutada:
La palabra clave
UNION
permite al usuario combinar los resultados de la consulta original con los de una nueva consulta que han construido. En este caso, están seleccionando los campos de nombre de usuario y contraseña de la tablausers
donde el nombre de usuario es “admin”. El guión doble al final de la cadena de entrada sirve como marcador de comentario para cualquier caracter restante en la consulta original, anulándolos efectivamente.Para prevenir la inyección de SQL, debes usar consultas parametrizadas en lugar de concatenar cadenas para construir dinámicamente las consultas de SQL. Las consultas parametrizadas te permiten separar el código de SQL de la entrada del usuario y hacen imposible que el usuario inyecte sus propios comandos en la consulta.