es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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:

    SQL % (' UNION SELECT password, username, null FROM users WHERE username = "admin"; --')
    

    Esto resultaría en la siguiente consulta de SQL siendo ejecutada:

    SELECT
        campo1,
        campo2,
        password,
        username,
        null
    FROM
        tbl
    WHERE username = "admin";
    --"
    

    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 tabla users 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.

Comments are closed.