Чи опора на параметризовані запити є єдиним способом захисту від введення SQL?


13

Все, що я бачив на ін'єкціях SQL-ін'єкцій, схоже, говорить про те, що параметризовані запити, особливо в збережених процедурах, є єдиним способом захисту від таких атак. Поки я працював (ще в темні століття) зберігаються процедури розглядалися як погана практика, головним чином тому, що вони розглядалися як менш рентабельні; менш випробуваний; сильно поєднані; і заблокував систему в одного постачальника; ( це питання охоплює деякі інші причини).

Хоча, коли я працював, проекти практично не знали про можливість таких атак; Для захисту бази даних від корупції різного роду були прийняті різні правила. Ці правила можна узагальнити як:

  1. Жоден клієнт / додаток не мав прямого доступу до таблиць баз даних.
  2. Усі звернення до всіх таблиць проводилися через представлення даних (а всі оновлення базових таблиць здійснювались через тригери).
  3. Усі елементи даних мали вказаний домен.
  4. Жоден елемент даних не був допущений до зведення нанівець - це мало наслідки, які зусилля DBA моментували зубами; але був примусовий.
  5. Ролі та дозволи були встановлені належним чином - наприклад, обмежена роль для надання лише поглядам права на зміну даних.

Тож чи є набір (примусових) правил, таких як цей (хоча це не обов'язково саме цей набір), підходящою альтернативою параметризованим запитам у запобіганні атак на ін'єкцію SQL? Якщо ні, то чому б і ні? Чи можна захистити базу даних від таких атак спеціальними заходами для бази даних?

EDIT

Наголос на питанні незначно змінився, з огляду на отримані початкові відповіді. Основне питання не змінилося.

EDIT2

Підхід, покладаючись на параматеризовані запити, видається лише периферійним кроком у захисті від атак на системи. Мені здається, що більш фундаментальні засоби захисту є і бажаними, і можуть покладатися на такі запити не потрібно або менш критично навіть захищати спеціально від нападів ін'єкцій.

Підхід, включений у моє запитання, базувався на "озброєнні" бази даних, і я не мав уявлення, чи є це життєздатним варіантом. Подальші дослідження показали, що існують такі підходи. Я знайшов такі джерела, які дають певні вказівки на такий тип підходу:

http://database-programmer.blogspot.com

http://thehelsinkideclaration.blogspot.com

Принципові особливості, які я взяв із цих джерел:

  1. Обширний словник даних у поєднанні з широким словником даних про безпеку
  2. Генерація тригерів, запитів та обмежень із словника даних
  3. Мінімізуйте код та максимізуйте дані

Хоча відповіді, які я мав до цього часу, дуже корисні і вказують на труднощі, що виникають внаслідок ігнорування параматеризованих запитів, в кінцевому підсумку вони не відповідають на мої початкові запитання (зараз підкреслено жирним шрифтом).


Я не купую аргументи проти збережених процедур. Вони просто не вірні.
Конрад Рудольф

Що відбувається з вимогою без нуля?
Марк Канлас

2
@Konrad Rudolph - Якщо ви пишете заявку на MySQL, а потім вирішили перейти на DB2, чи дійсно ви вважаєте, що збережені процедури будуть сумісними? Так само, якщо ви хочете перейти на SQLLite? Крім того, припустимо, що ви оновите свою ОС - якщо ваші збережені процедури будуть зібрані в C (який вони є в DB2), вони, ймовірно, потребують перекомпіляції. Це розумні аргументи - не абсолютні, але розумні.
Меттью Флінн

@Matthew Duh. Я насправді думав про «параметризовані запити», читаючи це і коментуючи це. Збережена процедура = ціла «інша історія».
Конрад Рудольф

Відповіді:


25

Збережені програми не захищають автоматично від ін'єкцій. Як що до цього

CREATE PROC proc
  @id VARCHAR(5)
AS
BEGIN
  EXEC("SELECT * FROM Client WHERE ClientId = " + @id);
END

Використання параметризованих запитів захистить вас від ін'єкцій, незалежно від того, чи є вони в документах чи ні.


Дякуємо вам за увагу до параметризованих запитів, а не до проектів. Однак я запитую, чи можна захищати базу даних іншими методами, ніж такими запитами - зокрема методами, обмеженими лише шаром бази даних.
Кріс Уолтон

1
+1 На додаток до цього, я хочу зазначити, що збережені програми в основному вважаються захищеними, оскільки це єдиний спосіб запобігти доступу користувачів безпосередньо до таблиць, зберігаючи спосіб отримання даних. Це єдиний спосіб забезпечити привілеї на основі рядків та стовпців, коли користувачеві потрібно мати прямий доступ до бази даних зі своїм клієнтом без нічого середнього.
Сокіл

2
@Chris - Я думаю, що тут говорить Крейг, що ви не можете припустити, що програми дійсно захищають вас. Це, мабуть, не повна відповідь, більше корекція припущення в заголовку.
Джон Хопкінс

@Jon - Я змінив назву питання і внесли деякі зміни до питання, зважаючи на виправлення Крейга. Мені не було відомо про припущення, яке я висловлював у питанні, поки не почав отримувати відповіді.
Кріс Уолтон

2
Для того, щоб зміцнити то , що пише вище Craig см databasesecurity.com/dbsec/lateral-sql-injection.pdf , «Бічний SQL Injection: Новий клас уразливості в Oracle»
Брюс Ediger

11

Тож чи є набір таких (примусових) правил, як ця, є відповідною альтернативою збереженим процедурам для запобігання атакам ін'єкції SQL? Якщо ні, то чому б і ні?

Ні, тому що вони наносять досить велике покарання розробникам. Розбивка на предмет:

1. Жоден клієнт / додаток не мав прямого доступу до таблиць баз даних.

Використовуйте ролі. Клієнти повинні мати доступ до БД тільки через обмежену роль, яка має лише доступ SELECT, INSERT, UPDATE та DELETE до тих таблиць (і рядків, де це можливо), до яких їй потрібен доступ. Якщо ви хочете переконатися, що жоден клієнт не може спамувати або видаляти всі записи, використовуйте API для зміни даних.

2. Усі звернення до всіх таблиць проходили через представлення даних.

Це може бути що завгодно, від незначної до величезної вартості продуктивності, залежно від ефективності поглядів. Це зайва складність, яка уповільнює розвиток. Використовуйте ролі.

3. У всіх елементах даних був вказаний домен.

Може бути багато роботи для підтримання, і, ймовірно, слід нормалізувати в окрему таблицю.

4. Жоден елемент даних не був дозволений для зведення нанівець - це мало наслідки, які змушували зусилля АПУ прицілювати зуби; але був примусовий.

Це просто неправильно. Якщо розробники не в змозі впоратися, NULLу вас є великі проблеми.

Чи можна захистити базу даних від таких атак спеціальними заходами для бази даних?

Вам не потрібні збережені процедури, просто використовуйте параметризовані запити з функцією, яка уникає аргументів, таких як pg_query_params . Звичайно, якщо у вашій базі даних є можливість запису у всьому світі або роль клієнта має повний доступ до всього, ви все одно накрутитеся. Хтось просто повинен підійти і зрозуміти, що робить клієнт, а потім готувати клієнта за п’ять хвилин, що знищує (або ще гірше, отруєння) вашої БД.



+1 для ролей. Вони є головним фактором у цьому - я не включав ролі у своє запитання, але вони були частиною налаштування - зокрема, поглядам було призначено обмежену роль, яку ви пропонуєте клієнтам. Точка, взята під ударні погляди на виставу. Домени включали тести перевірки - переважно діапазони та довжина. Ваші коментарі до правила зведення даних набагато ввічливіші, ніж деякі, які я чув про це правило. Я не заявив прямо, що дозволи будуть встановлені належним чином, хоча це було моїм припущенням.
Кріс Уолтон

6

Я не впевнений, що ваші правила вас повністю захищають.

Перша проблема полягає в тому, що ви заявляєте, що вони примусово застосовуються, але, так само як і значні витрати, я ніколи не бачив ідеального примусового виконання.

По-друге, я їх читаю, що такі правила можуть ускладнити експлуатацію, але вони не заважають цьому. Наприклад, відсутність прямого доступу до таблиць насправді не сильно змінюється, якщо представлення дозволяють отримувати доступ до одних і тих же даних. Якщо клієнтові потрібно щось зробити, це полегшить це, і якщо поле полегшує це, той самий функціонал / дані може використовуватись зловмисником.

Пам'ятайте також, що справа не лише в оновленні чи видаленні даних. Частина вразливості за допомогою інжекції SQL - це збирання інформації, і для цього вам не байдуже, чи були дані передані назад через перегляд vCustomers або нижчу таблицю клієнтів. Ви можете захистили себе від деяких слабких сторін , але не всі. Аналогічно, якщо оновлення може бути здійснено клієнтом, навіть якщо через тригери, тоді SQL можна записати для запуску тригерів та оновлення.

(Що стосується того, що всі оновлення здійснюються через тригери, я скажу дві речі: (1) коли я прочитав це, я трохи захворів у роті, і (б) вам не подобаються збережені процедури, оскільки вони ' re "менш рентабельний; менш перевірений; сильно пов'язаний; і заблокував систему в одного постачальника", але ви використовуєте тригери, про які в основному можна сказати одне і те ж.)

Все, що вам потрібно, - це один отвір, який дозволяє виконувати оператори SQL (і я не бачу жодного з цих правил, що це заважає), і зловмисник знаходиться в них. Вони можуть знайти за собою дуже неінтуїтивну базу даних, але якщо вони визначені, що це буде лише уповільнити їх, а не зупинити їх).

Інша річ у тому, що ви також додаєте складності та (як і накладні витрати), складність, як правило, призводить до появи дірок, які можна використовувати.

Я не кажу, що такий набір правил створити не вдалося - більше, чому ви б турбувались? Вони здаються більш громіздкими і менш надійними, ніж просто йти з широко прийнятими методами запобігання подібному нападу.


+1 за розуміння мого фактичного запиту з урахуванням моїх неявних, несвідомих припущень та за відповідне відповідь на нього. Що стосується того, чому можна турбуватися - я працюю над проектом, де значна частина коду буде генеруватися з відповідного опису архітектури - і частина цієї архітектури описує, як генерувати процедури доступу до бази даних. Досі відкрито щодо того, яку форму будуть приймати ці створені процедури.
Кріс Уолтон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.