SQL-frågor i PL/pgSQL planeras som förberedda satser. Så länge du bara klarar värden precis som du gör är SQL-injektion i allmänhet omöjlig . Detaljer:
Använd dynamisk SQL med EXECUTE
och utan korrekt parameterhantering för att faktiskt demonstrera SQL-injektion.
Gilla (så här inte). att göra det!):
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;
Den första variabeln em
skickas korrekt med USING
sats som värde och kan därför inte missbrukas för SQL-injektion.
Men den andra variabeln passwd
är felaktigt sammanlänkade utan att korrekt fly. Således kan användarinmatning konverteras till SQL-kod. SQL-injektion.
Använd aldrig detta! Förutom när man visar hur man inte gör det.
Liknande ofog är möjligt när SQL-strängar sammanfogas på felaktigt sätt i klienten.