Las consultas SQL en PL/pgSQL se planifican como declaraciones preparadas. Siempre y cuando solo pases valores como tú, la inyección SQL es generalmente imposible . Detalles:
Usa SQL dinámico con EXECUTE
y sin el manejo adecuado de parámetros para demostrar realmente la inyección de SQL.
Me gusta (así es como no hacerlo!):
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 primera variable em
se pasa correctamente con USING
cláusula como valor y por lo tanto no se puede abusar de la inyección de SQL.
Pero la segunda variable passwd
se concatena incorrectamente sin escapar correctamente. Por lo tanto, la entrada del usuario se puede convertir en código SQL. Inyección SQL.
¡Nunca uses esto! Excepto cuando se demuestra cómo no hacerlo.
Es posible que se produzcan daños similares cuando se concatenan incorrectamente cadenas SQL en el cliente.