SQL-ін'єкція

This page is a translated version of the page SQL injection and the translation is 68% complete.
Outdated translations are marked like this.

Огляд

SQL injection is a type of attack that uses vulnerabilities in an application's input validation or data typing for SQL queries.

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

Щоб отримати огляд атак із застосуванням SQL, перегляньте сторінку SQL Injection у Вікіпедії.

Приклад

Наступний фрагмент коду дозволить зловмиснику виконувати власні команди SQL (і є синтаксичною помилкою в Oracle).

$limit = $wgRequest->getVal( 'limit' );
$res = $db->query( "SELECT * from kitties LIMIT $limit" );

Бажаним способом виконання наведеного вище запиту буде:

$limit = $wgRequest->getVal( 'limit' );
$limit = intval( $limit ); // OPTIONAL validation
$res = $db->select( 'kitties',
                    '*',
                    false,
                    __METHOD__,
                    array( 'LIMIT' => $limit ) // REQUIRED automatic escaping
);

See Manual:Database access for more recent approaches to building SQL queries using the SelectQueryBuilder class.

Щоб використати вразливість і отримати електронні адреси зареєстрованих користувачів вікі, зловмисник використає рядок GET:

?limit=%201%20union%20select%20user_email%20from%20user;


SQL-ін'єкція і MediaWiki

MediaWiki має користувацький інтерфейс генерації SQL, який підтвердив свою ефективність в усуненні вразливостей ін'єкції SQL. Інтерфейс генерації SQL також забезпечує абстракцію СУБД і такі функції, як префікси таблиць.

Щоб захистити MediaWiki від ін’єкції SQL: