Налаштування захисту від SQL-ін'єкцій: аудит і впровадження

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

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Налаштування захисту від SQL-ін'єкцій: аудит і впровадження
Середній
від 1 дня до 3 днів
Часті запитання

SQL-ін'єкція: де саме ламається обробка запитів

SQL-ін'єкція з'являється там, де значення із зовнішнього джерела склеюється з текстом запиту. Рядок збирається конкатенацією: "WHERE login = '" + логін + "'" — і будь-яка лапка всередині значення змінює структуру команди, перестаючи бути даними.

База отримує вже готовий запит і не може відрізнити, що написав розробник, а що надійшло від користувача.

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

Далі — усе, що фільтрується, сортується або шукається: параметри вибірки, сортування за колонками, пагінація, ідентифікатори в адресі й заголовки запиту.

Перевірка вхідних даних нерідко формально є, але описана «за типом поля на формі» — а запит надходить безпосередньо до API, минаючи форму. Окрема категорія — динамічне складання запиту з рядків в адмінці, звітах і вивантаженнях, куди підставляються імена таблиць і колонок.

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

Функціональне тестування й швидкий сканер поверхнево цього не показують — потрібен аудит коду доступу до даних: ручний розбір усіх місць, де вхідні дані потрапляють у запит, і перевірка, що параметризація закриває їх повністю. Розбираємо, як це влаштовано.

Що змінюється після закриття уразливостей

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

Зникає цілий клас відмов, а не одна діра

SQL-ін'єкція — це не одинична помилка, а клас відмов: будь-який параметр, що потрапляє в текст запиту без обробки, відкриває доступ до чужих рядків або дозволяє видалити дані.

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

Реакція на інцидент — хвилини замість днів

Раніше про спробу експлуатації дізнавалися зі скарги або за зіпсованими даними, коли слід уже охолов. Тепер підозрілий ввід пишеться в журнал із контекстом запиту, а оповіщення надходить черговому одразу.

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

Перевірка релізу стала передбачуваною

Правила перевірки вибудовуємо за рекомендаціями OWASP і прив'язуємо до збіркового прогону. Зміни в місцях роботи з базою перевіряються автоматичним аналізатором до викладки, тому викладка не перетворюється на лотерею.

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

Підходи до захисту: порівняння варіантів упровадження

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

Альтернативи порівнюємо за трьома осями: коли підхід доречний, що він вимагає від команди й як позначається на вартості супроводу.

Варіант Коли підходить Обмеження
Параметризовані запити в шарі доступу до даних Є єдина точка складання запитів Правки потрібні всюди, де запит склеюється рядками
Побудовник запитів із прив'язкою значень Багато типових вибірок, команда вже працює на ньому Сирі вставки залишаються можливими — потрібна заборона на ревю
Розбір трафіку на периметрі Старі ділянки коду, які не можна правити одразу Хибні спрацювання й обхід кодуванням, причину не прибирає
Обмеження прав облікового запису застосунку Завжди — як страховка від витоку даних Ламає сценарії з широкими правами, потрібна ревізія доступів

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

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

Етапи робіт: аудит, схема, налаштування, перевірка, передача

SQL-ін'єкція рідко живе в одному місці: частіше це кілька точок, де зовнішні дані склеюються з рядком запиту — динамічне сортування, фільтри у звітах, пошук в адміністративній панелі.

Тому робота йде строго послідовно, від інвентаризації до передачі: так закриті ділянки не залишаються наполовину, а результат можна пред'явити й перевірити.

  1. Аудит точок формування запитів — проходимо по коду й знаходимо всі місця, де ввід потрапляє в текст запиту: сирі вставки поряд з ORM, шаблони звітів, фонові завдання й вивантаження.
  2. Схема потоків даних — за кожним знайденим шляхом фіксуємо, звідки надходить ввід, де він перевіряється й що йде в базу. Так видно сліпі зони та пріоритет виправлень.
  3. Налаштування захисту — переводимо запити на параметризацію, обмежуємо сортовані й груповані поля білим списком, видаємо ролі бази мінімально необхідні права, щоб помилка в коді не відкривала чужі таблиці.
  4. Перевірка результату — проганяємо набір спроб обходу за кожною точкою й звіряємося з журналами: важливо переконатися, що підстановка справді не виконується, а не просто не видна у відповіді.
  5. Обробка помилок і спостережуваність — прибираємо докладні тексти помилок бази з відповідей, додаємо ознаки підозрілих запитів у журнали й оповіщення чергової зміни.
  6. Передача регламентів — віддаємо команді правила роботи із запитами, чек-ліст для перевірки коду й автоматичну перевірку в конвеєрі збірки, щоб регрес ловився до викладки.

Документація, схеми запитів і політики доступу

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

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

  • Карта точок запиту — перелік усіх місць, де ввід із форми, фільтрів, пошуку, сортування або завантаження файлів потрапляє в запит, із зазначенням обробника й файлу, який закриває точку.
  • Схема потоку даних — шлях від поля на сторінці до команди бази з відмітками, де проходить перевірка типу й довжини, де підстановка параметрів, а де значення все ще склеюється в рядок.
  • Політики доступу й розмежування прав — окремі облікові записи для застосунку, для читання й для службових завдань, заборона прав на зміну схеми в робочого облікового запису, перелік об'єктів, до яких доступ закрито навмисно.
  • Опис обробки даних — які поля надходять від користувача, що зберігається у відкритому вигляді, що хешується, як обробляються динамічні імена таблиць і складені умови.
  • Регламент перевірок — що і з якою періодичністю проганяється: ручний розбір нових точок запиту за кожної зміни, автоматичні перевірки в збірці, окремі тести на спроби обходу.
  • Інструкція з реакції — які журнали дивитися за підозри на збій, як локалізувати шлях до конкретного обробника й як вимкнути його, не зупиняючи сервіс цілком.

Усе це ведеться в тому самому репозиторії, що й код, — за наступного доопрацювання видно, яке місце вже захищене, а яке з'явилося тільки зараз і потребує перевірки.

Кейс: уразливість в особистому кабінеті сервісу

Через особистий кабінет сервісу зловмисник отримав доступ до чужої історії замовлень — і помітили це не за сигналом моніторингу, а за скаргою клієнта.

Причина виявилася побутовою: в одному обробнику пошуку параметр із рядка запиту склеювався з текстом SQL-запиту, а обліковий запис застосунку мав право читати всю базу.

Ін'єкція через UNION вивантажувала таблицю користувачів, при цьому навантаження на сервер залишалося в нормі — за сплесками трафіку таке не відловити.

Розбір почали з інвентаризації всіх точок, де ввід потрапляє в запит: знайшли більше тридцяти, у чотирьох була пряма конкатенація.

Далі за рекомендаціями OWASP перевели ці місця на параметризовані запити, сортування й імена колонок — на білий список, а обліковому запису застосунку залишили мінімум прав: тільки потрібні таблиці, без доступу до схеми й службових розділів.

Фільтрацію підозрілих шаблонів на вході ввімкнули як другий бар'єр, зробивши ставку на виправлення коду.

Метрики до й після: час від спроби ін'єкції до блокування скоротився з 40 хвилин до 6 — з'явилися сигнатури в логах і автотести на 12 сценаріїв у релізному конвеєрі.

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

Усунення уразливості підтвердили повторним тестом — ті самі корисні навантаження тепер відбиває валідація, — а прогін на потрійному трафіку показав, що стійкість до навантаження не просіла.

Що робити, якщо SQL-ін'єкція вже призвела до витоку

Перша дія — не перезапускати сервіс: перезапуск стирає оперативну пам'ять разом із частиною свідчень.

Ізоляція сервісу робиться мережевими засобами — знімаємо його з балансувальника, переводимо застосунок у режим лише читання й закриваємо зовнішні підключення до бази, крім адміністративного. Знімки стану системи й бази зберігаємо до будь-яких правок.

Далі — розбір слідів доступу: журнал запитів СУБД, журнал помилок веб-сервера, історія активності облікового запису застосунку.

Шукаємо аномалії — масові вибірки таблиць, звернення до системних представлень схеми, нехарактерний час відповіді, — і за ними відновлюємо вектор: через яку форму або параметр пройшов ввід. Там же оцінюємо обсяг витоку даних: які таблиці читалися і скільки рядків вивантажено.

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

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

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

Відновлення довіри до даних іде слідом: звірка записів із резервними копіями, пошук несанкціонованих змін, увімкнення журналювання правок.

Обмеження підходу й технічні компроміси

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

Застарілий код живе своїм життям: у спадкових модулях запити, як і раніше, збираються склейкою рядків, і ні параметризація нових ділянок, ні перевірка вхідних даних їх не переписують.

Такі місця ми позначаємо у звіті аудиту й розбираємо за пріоритетом — спочатку ті, що доступні ззовні без авторизації.

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

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

Вплив на швидкість відповіді виявляється невеликим: підготовлені вирази й розбір параметрів дають витрати, які губляться на тлі мережевих затримок і роботи диска.

Помітний внесок робить інше — відсутність індексів під змінені умови вибірки, зайві перевірки прав на кожен запит, повторний розбір одного й того самого.

Час відповіді знімаємо до й після впровадження на бойовому профілі навантаження, щоб відокремити ефект захисту від сторонніх причин.

Зони відповідальності фіксуємо письмово. Наша частина — аудит, переписування уразливих ділянок, налаштування правил та їх перевірка на тестовому контурі.

На боці замовника — управління доступами до бази, ротація облікових даних, оновлення залежностей і порядок реакції на інцидент. Без явної межі захист деградує: правила залишаються, а звичка обходити їх — теж.

Обговоримо задачу й повернемося з оцінкою та планом

Перша зустріч працює на конкретиці, тому надішліть те, що вже є під рукою — ідеального набору не потрібно. Чим більше ввідних, тим точніша оцінка обсягу робіт: за описом «десь є діра у фільтрі» інженер назве лише вилку, а за картою точок входу — реальні етапи з порядком робіт.

  • Карту точок входу: форми, фільтри, пошук, методи звернення до бази — усе, куди потрапляє користувацький ввід і як він збирається в запит.
  • Схему доступів: які сервіси бачать базу, під якими правами, де лежать облікові дані й як вони змінюються.
  • Логи й приклади підозрілих звернень за останні тижні, якщо збій уже фіксували.
  • Опис середовищ: як правки доходять до робочого контуру, чи є ревю коду, автотести й поточні перевірки на збірці.
  • Обмеження: вікна обслуговування, заборона на зміну схеми даних, вимоги до зберігання персональних даних.
  • Відповідальних: хто на вашому боці підтверджує пріоритети й приймає результат.

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

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

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

Технічні сумніви й відповіді щодо впровадження

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

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

Як бути з динамічними запитами, де фільтри збираються на льоту?

Динаміка не заважає параметризації: значення передаються окремо від тексту запиту, змінюється лише структура — набір умов і сортувань.

Імена таблиць і колонок із вхідних даних не підставляємо, а звіряємо з білим списком; для складних вибірок запит збирається із заздалегідь перевірених фрагментів.

Як ви перевіряєте результат, а не «стало безпечніше»?

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

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060