SQL-инъекция

XKCD #327 "Exploits of a mom". Randall Munroe

SQL-инъекция (англ. SQL injection) — эксплуатация уязвимости веб-приложений, работающих с базой данных и не экранирующих должным образом пользовательский ввод, заключающаяся в передаче серверу баз данных через заполняемые пользователем текстовые поля произвольных команд SQL.

Как правило, инъекция начинается с '); или ';, завершающих строку и инструкцию SQL (INSERT или UPDATE/SELECT соответственно), за которыми следуют впрыскиваемые команды.

Если пользовательский ввод может попасть и в имена столбцов таблиц или даже значения нетекстового типа, не заключённые в кавычки, появляются возможности и других SQL-инъекций, например, вложенных запросов.

Инъекция обычно заканчивается символом комментария --, отсекающим остаток исходного запроса SQL, так что он не вызывает синтаксической ошибки.

Под пользовательским вводом следует понимать не только содержимое полей форм, но и весь код отдаваемых пользователю страниц на HTML и JavaScript.

В PHP, во избежание инъекций, все введённые пользователем строки, перед тем как формировать с их участием SQL-запросы, следует обрабатывать с помощью функций наподобие mysqli_real_escape_string (), экранируя и ограничители строк (' и ") и ограничители имён столбцов (`) или направлять весь пользовательский ввод в параметры запроса.

СсылкиПравить