Избегайте внедрения SQL во входящий запрос, входящий в параметр

У меня есть процедура, которая будет получать запрос в параметре. Я запускаю входящий запрос внутри процедуры, а инструмент Checkmarx обнаруживает внедрение SQL в my_cursor.

Как мне это решить?

Я пытался ввести функцию dbms_assert.noop, но бесполезно.

`create procedure test(common_query in varchar2)
as
sql_qry varchar2(2000);
Type cursor_type is ref cursor;
my_cursor cursor_type;
begin
sql_qry:=  common_query;
open my_cursor for sql_qry;
fetch my_cursor  into :name;
close my_cursor ;
end;`

Я пытался ввести функцию dbms_assert.noop, но не разрешил

Зачем вам нужна такая хранимая процедура? Можно ли изменить ваше приложение, чтобы оно не зависело от такой хранимой процедуры?

Luke Woodward 18.05.2024 18:08

Я просто пишу это в качестве примера: это обычная программа, несколько процедур/программа Java сформирует запрос на основе логики и пользовательского ввода и отправит этому SP, этот SP будет обрабатывать и выполнять некоторую общую логику, есть ли способ очистить входящий запрос строка для решения проблемы с внедрением SQL

Tamil Mani 18.05.2024 18:55

Единственный способ «очистить» целые операторы SQL — это сравнить их со списком предварительно одобренных операторов SQL. Если его нет в списке одобренных операторов, процедура не сможет его запустить. Именно так работают брандмауэры веб-приложений.

Bill Karwin 18.05.2024 19:55

Вы решаете эту проблему, не используя динамический SQL.

MT0 18.05.2024 21:04

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

Paul W 19.05.2024 04:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SQL-инъекция — это то, что вы делаете. Вы можете либо принять это, либо перепроектировать свой код, но не притворяйтесь, что этого не происходит.

Используйте SQL-инъекцию (осторожно)

Если вы пишете универсальный инструмент выполнения SQL, например имитацию Oracle SQL Developer или веб-сайт типа dbfiddle.uk, то вам нужно признаться себе, что вы выполняете SQL-инъекцию. Если это так, то ваши проблемы не могут быть решены простым DBMS_ASSERT или «очисткой входных данных вашей базы данных», как подразумевает знаменитый комикс XKCD.

Вам нужно будет тщательно изолировать и защитить пользователя базы данных посредством тщательной проверки привилегий, защиты от DDOS (например, использовать диспетчер ресурсов, чтобы избежать атак с использованием регулярных выражений) и, возможно, других вещей, о которых я не могу придумать. Добавьте в код несколько комментариев «ОПАСНО», чтобы будущие разработчики понимали риск и были в поиске ошибок безопасности. Попросите коллегу проверить код несколько раз.

Прежде чем пойти по этому пути, не пытайтесь попробовать что-нибудь простое, например, «разрешать только операторы, начинающиеся с SELECT». Существует множество хитрых способов внести изменения в оператор SELECT и изменить вашу базу данных. И даже чтение неправильной информации может быть опасным, поэтому вам все равно нужно учитывать привилегии.

Или, по крайней мере, если вы клянетесь всем, что можете доверять всем людям, имеющим доступ к приложению, предназначенному только для внутреннего использования, тщательно все документируйте и размещайте большие предупреждающие знаки, чтобы никто никогда не раскрывал ваш пользовательский интерфейс извне.

Наконец, вы можете изменить CheckMarx, чтобы исключить этот неизбежно несовместимый код. Почти каждое правило безопасности имеет исключение.

Реархитектор (наиболее вероятное решение)

Как предположил Билл Карвин, практически все программы используют заранее одобренные операторы SQL, в которые неизвестные значения подключаются как переменные привязки. В менее вероятном, но не очень редком случае, когда вам нужно сделать имя таблицы динамическим, вы можете использовать DBMS_SQL, чтобы проверить этот простой ввод. Или, как предположил Пол У., вам вообще нужна хранимая процедура? (Но не просто внедряйте SQL-инъекцию в интерфейс.) Какой тип обработки и общую логику добавляет ваша хранимая процедура? И можно ли с этим справиться с помощью функции базы данных, такой как представление или виртуальная частная база данных?

Другие вопросы по теме