SQL-forespørgsler i PL/pgSQL er planlagt som forberedte sætninger. Så længe du kun passerer værdier ligesom du gør, er SQL-injektion generelt umulig . Detaljer:
Brug dynamisk SQL med EXECUTE
og uden korrekt parameterhåndtering til faktisk at demonstrere SQL-injektion.
Like (sådan ikke). at gøre 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ørste variabel em
er korrekt videregivet med USING
klausul som værdi og kan derfor ikke misbruges til SQL-injektion.
Men den anden variabel passwd
er ukorrekt sammenkædet uden at undslippe korrekt. Således kan brugerinput konverteres til SQL-kode. SQL-injektion.
Brug aldrig dette! Undtagen når du demonstrerer, hvordan man ikke gør det.
Lignende uheld er muligt, når SQL-strenge sammenkædes forkert i klienten.