Почему EXECUTE IMMEDIATE разрешено в хранимых процедурах, если хранимые процедуры предназначены для смягчения атак внедрения SQL?Принятый ответ на следующий вопрос именует их как шаг против таких атак:
Что такое хранимая процедура? https://stackoverflow.com/a/459531/3163495
"Хранимые процедурытакже имеет преимущество в плане безопасности, заключающееся в том, что вы можете предоставлять права на выполнение хранимой процедуры, но пользователю не нужно иметь разрешения на чтение / запись для базовых таблиц. Это хороший первый шаг против внедрения SQL. "
... если хранимая процедура не использует EXECUTE IMMEDIATE.
Этот код PL / SQL возвращает описание продукта (второй параметр).
CREATE OR REPLACE PROCEDURE prodDescr(vname IN VARCHAR2, vresult OUT VARCHAR2) AS
vsql VARCHAR2(4000);
BEGIN
vsql := 'SELECT description FROM products WHERE name=''' || vname || '''';
EXECUTE IMMEDIATE vsql INTO vresult;
END;
Вредоносный ввод пользователя.
A' AND 1=2 UNION SELECT password FROM members WHERE username='admin
Сгенерированный запрос.
SELECT description FROM products WHERE name='A' OR 1=2 UNION SELECT password FROM members WHERE username='admin'
Когда запрос выполняется, злоумышленник получаетпароль администратора.
Как видите, несмотря на то, что мы использовали хранимую процедуру, злоумышленник может использовать уязвимость так же легко, как если бы мы были разработчиком-любителем, объединяющим некоторые операторы SELECT в PHP безУтверждая дезинфицирующий вклад.Мне кажется, может быть очень ошибочным говорить разработчикам, что хранимые процедуры помогут обеспечить безопасность вашей базы данных.