Як визначити, що сайт піддався sql ін'єкції - все про web розробці на

Як визначити, що сайт піддався sql ін'єкції - все про web розробці на
На головному сервісі моєї основної роботи стався збій. Треба сказати, вельми критичний для нашої компанії.

Розбір логів показав, що була проведена SQL ін'єкція шкідливого експлойта в один з SQL запитів на сайті.

Справа ускладнювалася тим, що до мене сайтом завідували люди, які власне на ньому і вчилися програмувати. Море коду, на який мій погляд навіть не падав. І десь в ньому, була дірка.

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

Для початку, невеличкий лікнеп, що таке SQL ін'єкція.

Що таке SQL ін'єкція

Візьмемо якийсь псевдо код

Тут є перевірка на те, що intval повинен повернути ціле число, і якщо в id лежить не число, то умова не спрацює і клопотання не буде виконаний.

І це вірно працює, якщо зробити такий запит

то умова не виконається: intval ( 'new') поверне 0.

Здається, що цього достатньо. Але питання, що станеться при наступному запиті

Звідси випливає діра в безпеці. Через неї, можна вставити будь-який SQL запит. Аж до delete from news

Методи боротьби з SQL ін'єкціями

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

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

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

Рано чи пізно такий метод вставки увійде у Вас в звичку. У моєму сервісі, як раз така помилка і була зроблена. У код, просто йшла змінна з get запиту.

Зі своїм кодом розібралися. Тут ми господарі становища. У більш-менш великому проекті, використовується більше кількість сторонніх бібліотек або додатків: ckeditor, ckfinder, jquery плагіни. збирачі, пакувальники, даунлоудери, системи статистики, phpmyadmin і т.д.

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

Набагато простіше, захистити ресурс в цілому. Наприклад, в моїй улюбленій CMS Danneo. це реалізовано на рівні API і в GET і POST запит, просто не можна вставляти ключові слова для SQL запитів.

Крім іншого, цей код захищає Вас від інших атак, css і т.п.

В результаті, якщо в запиті були заборонені слова, код поверне помилку 500 і викине виняток. Це не найкраще рішення. Якщо весь Ваш код ескейп змінні, і з цим все в порядку, то буде не зайвим оповістити адміністратора про спроби ін'єктування, а самому зловмиснику віддавати наприклад 404.

Наприклад, в моєму класі надбудові на mysql. я просто доповнив метод escape і якщо в нього потрапляє дані, які містять заборонені слова, відправляється лист на ящик адміністратора сайту, йому надсилається ip користувача, змінна на яку спрацював захист.

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

Ось мабуть і все заходи після яких ваш сайт вже буде не так просто зламати.

Бажаю Вам удачі, в нашій небезпечній професії)

Схожі статті