SQL заявките в PL/pgSQL се планират като подготвени изрази. Стига да предавате само стойности както и вие, SQL инжектирането обикновено е невъзможно . Подробности:
Използвайте динамичен SQL с EXECUTE
и без подходящо обработване на параметри за действително демонстриране на SQL инжектиране.
Харесвам (ето какне да го направя!):
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;
Първата променлива em
се предава правилно с USING
клауза като стойност и следователно не може да се злоупотребява за SQL инжектиране.
Но втората променлива passwd
е неправилно свързан без правилно екраниране. По този начин въведеното от потребителя може да бъде преобразувано в SQL код. SQL инжекция.
Никога не използвайте това! Освен когато демонстрирате как не трябва да го правите.
Подобно зло е възможно при неправилно свързване на SQL низове в клиента.