SQL-Abfragen in PL/pgSQL werden wie vorbereitete Anweisungen geplant. Solange Sie nur Werte übergeben wie Sie es tun, ist die SQL-Einschleusung im Allgemeinen unmöglich . Einzelheiten:
Verwenden Sie dynamisches SQL mit EXECUTE
und ohne richtige Parameterbehandlung, um die SQL-Einschleusung tatsächlich zu demonstrieren.
Wie (so nicht tun!):
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;
Die erste Variable em
wird korrekt mit dem USING
übergeben -Klausel als Wert und kann daher nicht für SQL-Injection missbraucht werden.
Aber die zweite Variable passwd
ist unsachgemäß verkettet, ohne ordnungsgemäß zu maskieren. Somit können Benutzereingaben in SQL-Code umgewandelt werden. SQL-Injection.
Nie verwenden! Außer wenn man demonstriert, wie man es nicht macht.
Ähnliches Unheil ist möglich, wenn SQL-Strings im Client unsachgemäß verkettet werden.