Защищаемся от SQL-инъекций
Если Вы уже достаточно хорошо знакомы с программированием сайтов в связке PHP + MySQL, то, наверное, знаете, что использование БД существенно облегчает программирование, уменьшает код, и вообще, намного удобнее.
Также Вы должны знать, что использование MySQL имеет свои минусы. Сложные сайты на MySQL сильно нагружают сервера, существуют некоторые сложности с бэкапом сайта (на файлах всё несколько проще), и большая (нежели на файлах) вероятность взлома.
Связано это с тем, что кроме обычных уязвимостей, при работе в связке PHP + MySQL дополнительно существует дополнительный вид уязвимостей, который именуется MySQL-injections (MySQL-инъекции).
Суть этих уязвимостей заключается в том, что хакер может внедрить в SQL-запрос свой код. С помощью такого метода, например, можно получить пароли пользователей, можно получить пароль доступа к админке (и тогда сайт будет полностью под контролем хакера), или (так иногда поступают некоторые хакеры) получить базу e-mail адресов пользователей с целью продажи её спамерам.
Наиболее частым способом выявления MySQL-инъекций является добавление кавычки к одному из параметров, получаемых от пользователя. Более подробно о способах обнаружения и примерах использования MySQL-инъекций Вы можете найти в Интернете (эта информация немного выходит за рамки данной статьи). А сейчас мы займёмся собственно защитой скрипта от взлома с помощью MySQL-инъекций.
Шаг №1. Скрываем “истинное лицо” страницы.
Для начала упрячем подальше сам скрипт обработки пользовательских запросов. Для этого мы будем использовать mod_rewrite. Вот как это будет выглядеть: вместо ссылок вида index.php?id=1, например, мы будем использовать ссылки вида 1.html. Кроме защиты это придаст также более эстетический вид ссылок, а вдобавок и более качественную индексацию сайта поисковыми системами.
Вот как это делается: создаём файл .htaccess в той директории, где хранится скрипт (если файл уже существует, то редактируем его, вписав новые строчки).
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^.htaccess$ – [F]
RewriteRule ^([0-9]*).html index.php?id=$1
Пройдёмся по строчкам: первая строка инициализирует mod_rewrite, вторая задаёт необходимые опции, третья определяет базовую директорию для перенаправления, четвёртая не позволит скачать хакеру файл .htaccess, а пятая описывает правило перенаправления.
Как это защитит от MySQL-инъекций? Если хакер введёт http://сайт.ru/1′.html, то mod_rewrite просто не пропустит этот запрос (так как строка 1′ не удовлетворяет условию перенаправления: то, что стоит перед .html должно быть последовательностью цифр).
Это лишь первая линия защиты. Данный код не защити Вас от хакеров, разве что от самых новичков. Опытный хакер найдёт сам файл index.php и будет атаковать уже его. Для большего укрепления первой линии обороны можно дать один совет: делайте сложные, и, самое главное, необычные имена файлов. Например, файл с названием haha_diehack_3456.asp.php, хоть и выглядит нелепо, но зато вряд ли будет найден хакером. И ни в коем случае не “светите” нигде реальное название файла скрипта!
Шаг №2. Фильтруем данные, полученные от пользователя.
Любой пользователь без проблем может быть хакером, так что не советую Вам доверять данным, полученным от пользователя. Заотсрять на фильтрации конкретных типов данных я не буду, об этом написана отдельная, очень обстоятельная статья.
Добавить надо вот что: как бы не были профильтрованы данные, опасность всё-равно остаётся. Поэтому кроме “обычной” фильтрации данных, экранируем все опасные символы с помощью специальной функции: mysql_real_escape_string.
$data = mysql_real_escape_string ($data, $connect);
Где $data – переменная, хранящая какие-то данные, полученные от пользователя (данную операцию нужно проделать со ВСЕМИ переменными, используемыми в SQL-запросах!), а $connect – подключение к базе MySQL (задаваемое функцией mysql_connect). Если Вы используете MySQLi, то для него есть аналогичная функция mysqli_escape_string.
Ах да, чуть не забыл! Для того, чтобы эта защита работала, любые данные, передаваемые в SQL-запросе надо защищать одинарными кавычками:
mysql_query (“SELECT * FROM table WHERE id = ‘$id’”)
вместо
mysql_query (“SELECT * FROM table WHERE id = $id”)
Вот так в два шага можно частично обезопасить себя от взлома хакерами Вашего сайта. Также, хотелось бы дать Вам несколько рекомендаций по защите сайта от MySQL-инъекций:
- фильтруйте, фильтруйте и ещё раз фильтруйте! Фильтрация данных когда-нибудь спасёт Ваш сайт
- тщательно формируйте SQL-запросы с использованием введённых пользователем переменных. Не делайте их на скорую руку
- и также тщательно тестируйте свой сайт на SQL-инекции. Будет гораздо лучше, если ошибку обнаружите Вы, а не злостный хакер
Желаю Вам успехов!





Добавить комментарий
Вы должны войти