Безопасность в MySQL и PHP

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

Минимизируем риски взломщиков в MySQL

Обыденная ситуация имеем хостинг, на котором расположено несколько сайтов, при этом каждый сайт подключается к базе данных под одним профилем с полными (root) правами.

1

Это очень опасно! В случае, если злоумышленник сможет взломать один из ваших сайтов и дойти до конфигурационных файлов, где указаны данные о подключении к СуБД «хакер» сразу же получает данные ко всем базам всех ваших сайтов, хранящихся в системе.

Для устранения данной угрозы для каждого сайта создаем пользователя с доступами только к базе данных соответствующего сайта:

Заполняем имя пользователя (желательно использовать цифробуквенное описание), Хост выбираем локальный, для пароля рекомендуется воспользоваться кнопкой «Генерировать». (Запишите куда-нибудь свой логин и пароль, чтобы не забыть их!).

1

Глобальных привилегий не выставляем, если базы данных у вас еще нет, можно использовать галочку «Создать базу данных с таким же именем и предоставить на неё все привилегии.», если база данных уже есть, просто жмем «Далее».

Затем переходим в раздел «База данных» категории «Пользователь», и выбираем те БД, к которым данный пользователь будет иметь доступ. Жмем «Вперед».

1

В привилегиях уровня базы данных отмечаем все, кроме раздела «Администрирование» и жмем «Вперед».

1

Все, мы создали пользователя с доступом только к тем базам данных, к которым мы ему разрешили обращаться.

Теперь можете попробовать зайти в phpMyAdmin под логином и паролем пользователя, которого вы только что создали.

Осталось в настройках конфигурации сайта изменить параметры подключения к базе данных. В CMS WordPress за это отвечает файл wp-config.php в корне сайта.

Рассмотрим вариант, если хакер все-таки получил доступ к вашей базе данных

Что может извлечь в данном случае злоумышленник: может изменить данные полей базы данных, а также выгрузить конфиденциальную информацию о ваших пользователях. В любом случае можно усложнить жизнь нашему злоумышленнику и здесь:

Используйте шифрование при записи данных в таблицы. Будьте внимательны, стандартный и даже двойной md5 в данном случае очень легко дешифруется. Используйте свой смешанный алгоритм шифрования, шифруйте пароли, электронные адреса и другие параметры, которые бы вы не хотели, чтобы в явном виде злоумышленник смог скачать из вашей базы данных.

По ссылке представлен один из методов шифрования средствами PHP http://veb.name/index.php?document=skript_shifrovaniya_dannih_par

Если кому-то интересен данный момент можно порассуждать в дальнейших статьях о примерах шифрования и дешифрования данных средствами PHP.

Теперь поговорим о безопасности в PHP

Вести беседы на тему безопасности в PHP можно бесконечно, сегодня в рамках данной статьи-обзора мы рассмотрим основы безопасности в PHP.

Ошибки в коде – являются потенциально опасными местами для злоумышленника. Так к нам на работу в рамках предпродажного аудита по оптимизации и продвижения сайта пришел сайт и просматривая рекомендации по нему обнаружил что-то вроде этого: «на сайте xxx обнаружены ошибки в коде php …. Рекомендуется исключить данные ошибки в коде.». Недолго думая в рамках нашей системы репортинга я дописал комментарий, что это не только рекомендация, но и прямая необходимость, т.к. такая ошибка подвержена SQL-инъекции. Другой мой молодой коллега, увидев мой комментарий и поискав в Интернете не сильно опасную SQL-инъекцию, уложил сервер нашего потенциального клиента поспать на пару часов.

Суть инъекции, которую он нашел на просторах интернета заключалась в следующем: ВЫПОЛНИТЬ команду «а» И ПОВТОРИТЬ её 1 000 000 раз. Естественно сервер не справился с такой нагрузкой.

Поэтому правило номер 1. Выводим все ошибки на дисплей и устраняем их. Для вывода всех ошибок достаточно добавить строчку php кода:

error_reporting(8191);

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

Обращаться к GET, COOKIE и POST переменным необходимо только через суперглобальные массивы $_GET, $_COOKIE и $_POST соответственно, на крайний случай через команду import_request_variables

SQL injection

 

<?php $user = mysql_fetch_assoc(mysql_query("SELECT * FROM `users` WHERE `username` = '{$_POST['username'}' AND `password` = '{$_POST['password']}'")); ?>

Выше представлен потенциально опасный php-код. Достаточно пользователю вместо пароля ввести ‘ OR `username` = ‘admin, то система авторизует злоумышленника как администратора.

Для исключения данной ошибки придумана команда addslashes(), которая экранирует строку с помощью слешей. А также команда mysql_real_escape_string(), которая экранирует специальный символы в строка для использования в SQL.

Проверка данных

Раздел проверка данных повествует о том, что всегда (ВСЕГДА!) необходимо проверять все данные, которые вводит пользователь. Есть несколько команд, с которыми надо обращаться очень осторожно.
Это include, require, readfile, eval, «, system, exec, create_function, dir, fopen и подобные.

Аунтификация

Весь смысл заключается в минимальном использовании cookies, которые очень легко редактировать. Для всех важных данных используйте сессии.

 

И напоследок

Еще раз повторюсь, проверяйте все места кода, данные в которых могут поступать от ваших пользователей.

 

Понравилась статья? - поделись с друзьями!

Категория: ВебДев