Pregunta

¿Son menos vulnerables a la inyección de SQL que hacer cosas como mysql_query (" SELECT important_data FROM users WHERE password = $ password ") ?

¿Fue útil?

Solución

Son más seguros que lo que estás haciendo. Su consulta está publicando SQL sin procesar en la base de datos, lo que significa que sus parámetros no se tratan como parámetros sql sino como simples sql antiguos.

Esto es lo que quiero decir.

Con un procedimiento almacenado, la variable de contraseña no puede ser sql, tiene que ser una pieza de información que el sistema está buscando. En su ejemplo, lo que realmente se envía a la base de datos es

SELECT * FROM Usuario donde contraseña = ('su contraseña aquí' - $ Contraseña variable) ..... para que alguien pueda hacer algo como

SELECT * FROM user WHERE Password = ('su contraseña aquí'; SELECT * FROM User - $ contraseña variable).

o peor aún:

SELECT * FROM user WHERE Password = ('su contraseña aquí'; DROP Database Database_Name - $ contraseña variable).

Un procedimiento almacenado sql no dinámico no permitirá esto, porque el parámetro de entrada no se ejecutará como sql adicional.

El SQL parametrizado se encarga de esto, pero los procedimientos almacenados técnicamente son un poco más seguros, porque el usuario que accede a la información de la tabla no necesita acceso de lectura. Solo necesita poder ejecutar el procedimiento almacenado. Dependiendo de su necesidad, esto puede o no entrar en juego.

Otros consejos

No necesariamente, podría estar haciendo una concatenación de cadenas dentro de ella y la exposición sería la misma. Si usa sql dinámico con variables de parámetro (sin concatenación de cadenas para producir SQL), estaría bastante bien protegido.

Mientras use parámetros y no use la concatenación de cadenas para los valores ingresados ??por el usuario, no habrá riesgo de inyección SQL. Los procedimientos almacenados son un poco "más seguros" en este aspecto, porque lo alientan a usar parámetros. Pero si en el procedimiento haces algo como

EXECUTE 'SELECT important_data FROM users WHERE password = ' + @password

Entonces volverá al punto 1 y será muy vulnerable a las inyecciones de SQL.

Además, existen las declaraciones preparadas " que no son procedimientos almacenados, pero también pueden usar parámetros. Por lo tanto, también pueden usarse para evitar la inyección de SQL.

No hay tecnologías seguras. Las tecnologías solo se pueden usar de manera segura o insegura.

Dicho esto, los procedimientos almacenados requieren una codificación ligeramente más creativa para permitir la inyección de SQL, lo que, sin embargo, ocurre. Nada le impide concatenar cadenas en ellos, en cualquier motor de base de datos SQL que yo sepa.

si están parametrizados correctamente y no está haciendo sql dinámico, entonces son más seguros y también se beneficiará de la reutilización del plan de ejecución

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top