SQL-query's in PL/pgSQL worden gepland als voorbereide instructies. Zolang u alleen waarden doorgeeft zoals jij, is SQL-injectie over het algemeen onmogelijk . Details:
Gebruik dynamische SQL met EXECUTE
en zonder de juiste parameterafhandeling om daadwerkelijk SQL-injectie te demonstreren.
Vind ik leuk (dit is hoe niet om het te doen!):
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;
De eerste variabele em
correct wordt doorgegeven met de USING
clausule als waarde en kan dus niet worden misbruikt voor SQL-injectie.
Maar de tweede variabele passwd
onjuist is aaneengeschakeld zonder op de juiste manier te ontsnappen. Zo kan gebruikersinvoer worden geconverteerd naar SQL-code. SQL-injectie.
Gebruik dit nooit! Behalve bij het demonstreren hoe het niet moet.
Soortgelijke kattenkwaad is mogelijk wanneer SQL-strings in de client onjuist worden samengevoegd.