As consultas SQL em PL/pgSQL são planejadas como instruções preparadas. Desde que você passe apenas valores como você, injeção de SQL geralmente é impossível . Detalhes:
Use SQL dinâmico com
EXECUTE
e sem manipulação de parâmetros adequada para realmente demonstrar injeção de SQL. Curtir (é assim que não fazer isso!):
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;
A primeira variável
em
é passado corretamente com o USING
cláusula como valor e, portanto, não pode ser abusado para injeção de SQL. Mas a segunda variável
passwd
é concatenado incorretamente sem escapar adequadamente. Assim, a entrada do usuário pode ser convertida em código SQL. Injeção SQL. Nunca use isso! Exceto quando demonstrando como não fazê-lo.
Um dano semelhante é possível ao concatenar strings SQL no cliente incorretamente.