[gull] Requêtes SQL en LIKE ...% avec psycopg3
Marc SCHAEFER
schaefer at alphanet.ch
Tue Apr 23 10:41:44 CEST 2024
Hello,
On Mon, Apr 22, 2024 at 04:47:55PM +0200, Philippe Strauss via gull wrote:
> Le code (pour le framework Flask) d'un de ces support d'autocomplete est:
Je ne connais pas :)
Le risque principal avec LIKE c'est que des % peuvent être injectés.
C'est surtout dangereux dans du code comme:
SELECT COUNT(*) FROM login WHERE (email LIKE ?) AND (password LIKE ?)
Ici, il faut utiliser "=" et pas "LIKE" pour éviter une attaque qui
permettrait de passer outre l'authentification.
Dans le cas présent, deux recommandations:
a) j'utiliserais une whitelist style ^[A-Z][a-z][0-9]$ ou une blacklist
interdisant % -> ceci devrait limiter le risque sur le LIKE
b) consulter le manuel de l'ORM utilisé pour voir comment on associe
de manière sûre des variables ici (genus.upper()+'%' à des
paramètres positionnels ou nommés, dans mon exemple ci-dessus j'ai
utilisé des paramètres positionnels ? -> ceci devrait limiter le
risque d'injection SQL
En regardant le code, j'ai l'impression qu'il s'agit d'un simple printf
où la valeur genus.upper()+'%', est simplement concaténée (traitement de
texte SQL). Donc, si genus.upper() contient "%"; TRUNCATE myco.genus;
et que l'interface à la BD utilisée supporte des commandes multiples via
l'interface utilisée, c'est abusable. Et même sans commandes multiples,
c'est probablement abusable quand même dans une certaine mesure
(requêtes imbriquées par exemple).
Mais peut-être que je me trompe et que l'expression sera non seulement
échappée, de manière compatible avec la BD utilisée, mais en plus
mise dans une chaîne ... dans ce cas, le seul risque qui reste est le
a).
Dans des cas de doutes, j'ai tendance à activer le debug sur la BD pour
voir les requêtes SQL effectivement traitées, on voit parfois que
certains ORM fabriquent des horreurs (en sécurité & performance).
More information about the gull
mailing list