SQL-инъекция для хранимой процедуры - PullRequest
0 голосов
/ 26 апреля 2018

Я оцениваю возможность выполнения SQL-инъекций для моего sp.

Я пытался использовать это для выполнения SQL-инъекций, но не смог внедрить (то есть текст внедрения был вставлен в таблицу, как обычно):

data'; DROP TABLE my_table; --

Как мне попробовать SQLинъекции?Или SP настолько безопасен, что SQL-инъекция как-то предотвращена?

Мой уменьшенный SP, как показано ниже:

@ID int,
@AIType varchar(1),
@parent varchar(20),
@child varchar(20),
AS
BEGIN

SET NOCOUNT ON;
-- Insert statements for procedure here
BEGIN TRY
    UPDATE AI_Grouping
    SET AIType=@AIType, 
        parent=@parent,
        child=@child,
    WHERE ID=@ID
END TRY
BEGIN CATCH
    -- Catch exceptions
END CATCH
END 

РЕДАКТИРОВАТЬ:

В случаеэто помогает - на переднем крае у меня есть проверка длины поля, которая соответствует типу переменной SP.Некоторые поля ограничены максимум 8 символами, некоторые - максимум 20 символами (как в примере выше).Может быть, пример внедрения, который я пробовал выше, является плохим примером, потому что длина составляет более 20 символов ... Последний вопрос: уязвим ли мой SP для внедрения SQL или нет?

1 Ответ

0 голосов
/ 26 апреля 2018

Из статьи: Как написать SQL-инъекцию PL / SQL

Различие между текстом оператора SQL с фиксированным временем компиляции и созданным во время выполненияТекст оператора SQL

Мы определяем термин текст оператора SQL с фиксированным временем компиляции, чтобы обозначать текст оператора SQL, который не может изменяться во время выполнения и который можно уверенно определить, прочитав исходный код.Точнее, это текст оператора SQL, который является статическим выражением PL / SQL varchar214.Значение статического выражения varchar2 PL / SQL не может изменяться во время выполнения и может быть предварительно вычислено во время компиляции.

Текст оператора SQL для встроенного SQL составляется компилятором PL / SQL и не может изменяться во время выполнения,Следовательно, встроенный SQL определенно выполняет только текст SQL оператора с фиксированным временем компиляции15.

Однако можно легко договориться о том, что любой из методов PL / SQL для выполнения динамического SQL будет, на определенном сайте вызова, выполняться толькоSQL с фиксированным временем компиляции.

Таким образом, ваш код безопасен.

Различать SQL с фиксированным временем компиляции и SQL-файл, созданный во время выполнения . Вот два примера:

SQL-код с фиксированным временем исполнения

CREATE PROCEDURE remove_emp (p_employee_id NUMBER) AS
  BEGIN
     -- here the delete command is immutable, therefore sql injection safe
     DELETE FROM employees
        WHERE employees.employee_id = p_employee_id;
  END;

-произведенный во время выполненияSQL

CREATE PROCEDURE remove_emp (p_employee_id VARCHAR2) AS
  BEGIN
     -- here the delete command is dynamically created allowing 
     -- sql injection
     execute immediate 'DELETE FROM employees
        WHERE employees.employee_id = ' || p_employee_id || ';';
  END;
...