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.