Le query SQL in PL/pgSQL sono pianificate come istruzioni preparate. A patto di trasmettere solo valori come te, l'iniezione SQL è generalmente impossibile . Dettagli:
Usa SQL dinamico con EXECUTE
e senza un'adeguata gestione dei parametri per dimostrare effettivamente l'iniezione di SQL.
Mi piace (è così che non). per farlo!):
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;
La prima variabile em
è correttamente passato con il USING
clausola come valore e quindi non può essere abusato per SQL injection.
Ma la seconda variabile passwd
è concatenato in modo improprio senza scappare correttamente. Pertanto, l'input dell'utente può essere convertito in codice SQL. Iniezione SQL.
Non usarlo mai! Tranne quando si dimostra come non farlo.
Un simile danno è possibile quando si concatenano stringhe SQL nel client in modo improprio.