Injection SQL dans les fonctions Postgres vs requêtes préparées


Réponses:


36

Ça dépend.

Fonctions SQL

Avec LANGUAGE sql, la réponse est généralement oui .

Les paramètres passés sont traités comme des valeurs et l'injection SQL n'est pas possible - tant que vous n'appelez pas de fonctions dangereuses à partir du corps et passez des paramètres.

Fonctions PL / pgSQL

Avec LANGUAGE plpgsql, la réponse est normalement oui .

Cependant , PL / pgSQL permet un SQL dynamique où les paramètres (ou parties) passés sont concaténés à une chaîne de requête et exécutés avec EXECUTE. Cela peut convertir les entrées utilisateur en code SQL et rendre l'injection SQL possible . Vous ne pouvez pas dire de l'extérieur si le corps de la fonction la gère correctement. Des outils sont fournis.

Utilisez uniquement le SQL dynamique là où vous en avez besoin. Les instructions SQL simples utilisant des paramètres comme valeurs sont sûres contre l'injection SQL comme les fonctions SQL.

Pour le SQL dynamique , passez de préférence des valeurs en tant que valeurs avec:

Rend l'injection SQL impossible sur le principal.

Si vous concaténez des valeurs dans la chaîne SQL, utilisez:

Encapsule les chaînes entre guillemets en toute sécurité, évitant ainsi les erreurs de syntaxe et l'injection SQL.

Traitez les paramètres qui doivent être traités comme des identifiants dans la chaîne SQL avec:

Inclut les chaînes entre guillemets en toute sécurité là où cela est nécessaire , évitant ainsi les erreurs de syntaxe et l'injection SQL.

En relation:

Ne construisez jamais une chaîne à partir de l'entrée utilisateur et exécutez-la. Cela inclut les identifiants, transmis directement par un utilisateur ou récupérés à partir d'un catalogue système. Tous doivent être traités comme des entrées utilisateur et cités en toute sécurité lors de la construction de SQL dynamique!

En savoir plus sur les implications en termes de performances dans cette réponse connexe:

Notions de base sur l'injection SQL:

Des considérations similaires s'appliquent aux autres langages côté serveur qui autorisent le SQL dynamique.


Donc, en résumé: si 1) j'utilise uniquement le langage sql, je suis sûr, 2) si j'utilise plpgslq mais pas d'exécution, je suis sûr, 3) si j'utilise plpgsql et exécute mais pas d'identifiants et% s ou% L selon le cas, je suis en sécurité, ou 4) si j'utilise plpgsql et exécute et identificateurs, mais% I ou quote_ident selon le cas, je suis en sécurité. Correct?
mickeyf_supports_Monica

@mickeyf: Fondamentalement oui. De plus, utilisez la USINGclause pour transmettre des valeurs à EXECUTEchaque fois que possible. Vous pouvez appeler une fonction PL / pgSQL depuis une fonction SQL et passer des paramètres. Donc, pour être absolument correct, vous êtes en sécurité tant que vous n'appelez pas de fonctions dangereuses directement ou indirectement. Si toutes vos fonctions sont effectuées correctement, cela ne peut pas se produire.
Erwin Brandstetter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.