Вебмайстер
Яндекс для вебмайстрів
Як Яндекс індексує сайти
Сайт на сторінці результатів пошуку
Сервіс «Яндекс.Вебмайстер»
Налаштування індексування
Вміст сайту
Сайт у результатах пошуку
Безпека сайтів
Сервіси Яндекса на вашому сайті

SQL-ін'єкція

Cтаття "Забезпечення безпеки веб-сайтів" надана Sophos Plc і SophosLabs.

Грудень 2007 р.

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

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

Примітка. 

Розглянемо такий PHP-код:

$firstname = $_POST["firstname"]; mysql_query("SELECT * FROM users WHERE first_name='$firstname'");

Після того, як користувач введе своє ім'я у веб-формі, SQL-запит поверне список усіх користувачів з тим же ім'ям. Якщо зазначити у формі ім'я «Кріс», то SQL-запит матиме такий вигляд:

"SELECT * FROM users WHERE first_name='Chris'"

Це допустима конструкція, яка спрацює так, як очікується. Але що станеться, якщо замість імені ввести, наприклад, «'; drop table; #»? Тоді конструкція виглядатиме так:

"SELECT * FROM users WHERE first_name=''; DROP TABLE users; #'"

Крапка з комою дозволяє виконувати декілька команд, що йдуть одна за одною. У результаті проста SQL-команда перетворюється на складну трьохскладену конструкцію:

SELECT * FROM users WHERE first_name='';


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

Наведена у прикладі вразливість особливо небезпечна, оскільки її можна використати для виведення закритих даних, зміни окремих полів або видалення інформації. Деякі СКБД також дозволяють виконувати системні команди за допомогою SQL.

На щастя, цей вид загрози легко усунути завдяки перевірці даних, що вводяться користувачем. У PHP є спеціальна функція mysql_real_escape_string, яка видаляє з рядка потенційний код SQL-ін'єкції. Її слід використовувати для фільтрації всіх даних, що вводяться в SQL-інструкції.

До наступного розділу

Оцініть статтю
Дякуємо за ваш відгук!