Kueri SQL di PL/pgSQL direncanakan seperti pernyataan yang disiapkan. Selama Anda hanya lulus nilai seperti yang Anda lakukan, injeksi SQL umumnya tidak mungkin . Detail:
Gunakan SQL dinamis dengan EXECUTE
dan tanpa penanganan parameter yang tepat untuk benar-benar mendemonstrasikan injeksi SQL.
Suka (ini caranya tidak untuk melakukannya!):
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;
Variabel pertama em
diteruskan dengan benar dengan USING
klausa sebagai nilai dan dengan demikian tidak dapat disalahgunakan untuk injeksi SQL.
Tapi variabel kedua passwd
tidak benar digabungkan tanpa benar melarikan diri. Dengan demikian, input pengguna dapat dikonversi ke kode SQL. Injeksi SQL.
Jangan pernah gunakan ini! Kecuali saat mendemonstrasikan bagaimana tidak melakukannya.
Kerusakan serupa mungkin terjadi saat menggabungkan string SQL di klien secara tidak benar.