Привет. Сегодня рассмотрим возможные варианты как может быть реализована защита от 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 инъекций в своих проектах по созданию сайтов.