SQL dotazy v PL/pgSQL jsou plánovány jako připravené příkazy. Dokud předáváte pouze hodnoty stejně jako vy je injekce SQL obecně nemožná . Podrobnosti:
Použijte dynamické SQL s EXECUTE
a bez správného zpracování parametrů, které by skutečně demonstrovaly vkládání SQL.
Jako (takto ne udělat to!):
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;
První proměnná em
je správně předán s USING
klauzule jako hodnota a nelze je tedy zneužít pro vkládání SQL.
Ale druhá proměnná passwd
je nesprávně zřetězen, aniž by správně unikal. Vstup uživatele tak lze převést na kód SQL. SQL injection.
Toto nikdy nepoužívejte! Kromě předvádění, jak to nedělat.
Podobná neplecha je možná při nesprávném zřetězení SQL řetězců v klientovi.