Inyección SQL en funciones de Postgres vs consultas preparadas


Respuestas:


36

Depende.

Funciones SQL

Con LANGUAGE sql, la respuesta es generalmente sí .

Los parámetros pasados ​​se tratan como valores y la inyección SQL no es posible, siempre y cuando no llame a funciones inseguras desde el cuerpo y pase parámetros.

Funciones PL / pgSQL

Con LANGUAGE plpgsql, la respuesta es normalmente .

Sin embargo , PL / pgSQL permite un SQL dinámico donde los parámetros (o partes) pasados ​​se concatenan a una cadena de consulta y se ejecutan con EXECUTE. Esto puede convertir la entrada del usuario a código SQL y hace posible la inyección SQL . No se puede saber desde afuera si el cuerpo de la función lo maneja correctamente. Se proporcionan herramientas.

Solo use SQL dinámico donde lo necesite. Las declaraciones SQL simples que usan parámetros como valores son seguras contra la inyección SQL como las funciones SQL.

Para SQL dinámico , preferiblemente pase valores como valores con:

Hace que la inyección de SQL sea imposible en el principal.

Si concatena valores en la cadena SQL, use:

Envuelve las cadenas entre comillas simples de forma segura, evitando así los errores de sintaxis y la inyección de SQL.

Parámetros de proceso que se tratarán como identificadores en la cadena SQL con:

Encierra cadenas entre comillas dobles de forma segura donde sea necesario , evitando así los errores de sintaxis y la inyección de SQL.

Relacionado:

Nunca construyas una cadena a partir de la entrada del usuario y la ejecutes. Esto incluye identificadores, pasados ​​directamente por un usuario o extraídos de un catálogo del sistema. ¡Todos deben tratarse como una entrada del usuario y citarse de manera segura al crear SQL dinámico!

Más información sobre las implicaciones de rendimiento en esta respuesta relacionada:

Conceptos básicos sobre la inyección SQL:

Consideraciones similares se aplican a otros lenguajes del lado del servidor que permiten SQL dinámico.


Entonces, en resumen: si 1) solo uso el lenguaje sql, estoy seguro, 2) si uso plpgslq pero no ejecuto, estoy seguro, 3) si uso plpgsql y ejecuto pero no hay identificadores y% so% L, según corresponda, estoy a salvo, o 4) si uso plpgsql y ejecuto e identificadores, pero% I o quote_ident, según corresponda, estoy a salvo. ¿Correcto?
mickeyf_supports_Monica

@mickeyf: Básicamente sí. Además, use la USINGcláusula para pasar valores EXECUTEsiempre que sea ​​posible. Usted podría llamar a una función PL / pgSQL desde dentro de una función SQL y pasar parámetros. Por lo tanto, para ser absolutamente correcto, está seguro siempre que no llame a ninguna función insegura directa o indirectamente. Si todas sus funciones se realizan correctamente, eso no puede suceder.
Erwin Brandstetter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.