Zapytania SQL w PL/pgSQL są planowane jak przygotowane instrukcje. O ile przekazujesz tylko wartości tak jak Ty, wstrzykiwanie SQL jest generalnie niemożliwe . Szczegóły:
Użyj dynamicznego SQL z EXECUTE
i bez odpowiedniej obsługi parametrów, aby zademonstrować wstrzykiwanie SQL.
Lubię (w ten sposób nie to zrobić!):
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;
Pierwsza zmienna em
jest prawidłowo przekazany z USING
klauzula jako wartość i dlatego nie może być nadużywany do wstrzykiwania SQL.
Ale druga zmienna passwd
jest niewłaściwie połączony bez poprawnej ucieczki. W ten sposób dane wprowadzone przez użytkownika można przekonwertować na kod SQL. Wstrzyknięcie SQL.
Nigdy tego nie używaj! Z wyjątkiem demonstracji, jak tego nie robić.
Podobna szkoda jest możliwa w przypadku nieprawidłowego łączenia ciągów SQL w kliencie.