Les requêtes SQL en PL/pgSQL sont planifiées comme des instructions préparées. Tant que vous ne transmettez que des valeurs comme vous le faites, l'injection SQL est généralement impossible . Détails :
Utiliser SQL dynamique avec EXECUTE
et sans gestion appropriée des paramètres pour réellement démontrer l'injection SQL.
Comme (c'est comme ça pas pour le faire !) :
CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
RETURNS SETOF users AS
$func$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM users
WHERE email = $1
AND encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
USING em;
END
$func$ LANGUAGE plpgsql;
La première variable em
est correctement passé avec le USING
clause comme valeur et ne peut donc pas être abusé pour l'injection SQL.
Mais la deuxième variable passwd
est incorrectement concaténé sans s'échapper correctement. Ainsi, l'entrée de l'utilisateur peut être convertie en code SQL. Injection SQL.
Ne l'utilisez jamais ! Sauf en démontrant comment ne pas le faire.
Un méfait similaire est possible lors de la concaténation incorrecte de chaînes SQL dans le client.