Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Анализ актуальных киберугроз

Защиты от угроз воздействия на структуру веб-сайта, находящегося на веб сервере, реализованном на базе вычислительной системы

Методика защиты от SQL - инъекций

Самое главное -- не вставлять чистую переменную прямо в 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 не только безопаснее, но и удобнее с точки зрения кода, и быстрее с точки зрения выполнения запросов (у них есть встроенный механизм работы с транзакциями, запросами и многим другим).

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Предыдущая   СОДЕРЖАНИЕ   Следующая >
 
Предметы
Агропромышленность
Банковское дело
БЖД
Бухучет и аудит
География
Документоведение
Естествознание
Журналистика
Информатика
История
Культурология
Литература
Логика
Логистика
Маркетинг
Математика, химия, физика
Медицина
Менеджмент
Недвижимость
Педагогика
Политология
Право
Психология
Религиоведение
Социология
Статистика
Страховое дело
Техника
Товароведение
Туризм
Философия
Финансы
Экология
Экономика
Этика и эстетика
Прочее