Защита от SQL инъекций
mysql PHP

Защита от SQL инъекций на PHP

Привет. Сегодня рассмотрим возможные варианты как может быть реализована защита от SQL инъекций.

Защита от SQL инъекций

Сначала разберемся с вопросом что же такое SQL-инъекция. Само по себе слово инъекция подразумевает, что что-то инородное куда-то вводится. На самом деле так и есть. Если в коде на PHP (либо другом языке) данные полученные от браузера сразу же вставляются в MySQL запрос, без предварительной обработки, то пиши пропало. Это означает, что злоумышленник потенциально может снести всю таблицу (а может сделать и ещё что похуже) даже если выполняется обычный запрос SELECT. Приведу пример:

$search=$_GET['query'];
$query="SELECT * FROM table WHERE field = ".$search;

То есть переменная $search, полученная из $_GET сразу же попадает в запрос к БД, и злоумышленник может передать что-то вроде:

1; DROP TABLE table;

То есть при стандартной настройке MySQL сервера (при которой разделитель между разными запросами — это точка с запятой), и при подстановке в запрос получится:

SELECT * FROM table WHERE field = 1;DROP TABLE table;

Сначала, конечно, выберется всё, что есть в этой таблице с field=1 (так выполнится запрос SELECT), а затем эта таблица просто удалится (конечно, если хватит прав у пользователя БД, но чаще всего их хватает).

Внимание! Приведенный выше пример — только для образовательных целей, не нужно использовать его для злого умысла.

Какие есть методы? Защита от sql инъекций PHP

Самое главное — не вставлять чистую переменную прямо в SQL запрос. Лучше всего пропустить её через специальный обработчик.
В случае с MySQL и PHP есть 2 варианта. Первый чуть более старый (так сказать «допотопный»), а второй современный и объектно ориентированный. Выбор метода зависит от того, как именно вы передаёте данные в MySQL. Если используете уже устаревшую функцию mysql_query — то подойдет первый способ, если же современный и надежный PHP класс PDO — вторую.

Рассмотрим первый способ защита от sql инъекций PHP через mysql_query

Если вы всё-ещё используете старые функции mysql_connect, mysql_select_db и mysql_query, то на помощь в защита от sql инъекций подойдет функция: mysql_real_escape_string.
Суть действия этой функции в автоматическом заключении передаваемой переменной в кавычки. Казалось бы, что тут сложного, но большинство запросов, в которых эта функция применяется успешно спасают от SQL инъекций. В крайнем случае запрос заканчивается ошибкой на стороне сервера базы данных, но катастрофических изменений не происходит.

Рассмотрим на нашем примере:

$search=$_GET['query'];
$search=mysql_real_escape_string($search);
$query="SELECT * FROM table WHERE field = ".$search;

В итоге всё пройдет нормально. В запросе MySQL будет следующий код:

SELECT * FROM table WHERE field = '1;DROP TABLE table;'

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

Второй способ: защита от sql инъекций PHP и PDO

PDO — это встроенный класс PHP, который обеспечивает современную связь с БД, объектно-ориентированный подход и встроенную защиту от инъекций.

В PDO есть встроенная функция prepare, которая подготавливает запрос к выполнению с учетом предполагаемых параметров, и функция execute, в которую можно передавать параметры для выполнения запроса.

Рассмотрим на примере:

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array('column' => $unsafeValue));

Думаю, из кода и так всё понятно, но поясню.
Сначала мы создаём запрос к БД (пока это только объект на PHP) — $preparedStatement. При создании (с помощью prepare) мы указали, что в запросе будет участвовать один параметр :column (параметров может быть сколько угодно, но важно, чтобы декларации этих параметров в запросе начинались с двоеточия.
Затем мы выполняем запрос, передавая массив параметров для подстановки в запрос с функцией execute. При этом все переменные, передаваемые в запрос с функцией execute автоматически защищаются от SQL инъекций.

Вообще говоря, если версия PHP позволяет, использование PDO не только безопаснее, но и удобнее с точки зрения кода, и быстрее с точки зрения выполнения запросов (у них есть встроенный механизм работы с транзакциями, запросами и многим другим). Но об использовании PDO в следующих выпусках.

Спасибо за внимание, надеюсь приведенные примеры помогут вам в защита от sql инъекций ваших сайтов.

Уверен, что этой информацией владеют в techpixel.com, и успешно применяют защиту от SQL инъекций в своих проектах по созданию сайтов.


Также рекомендуем: