Статьи ⇒ PHP ⇒ Пишем безопасный код на PHP. Часть 1

Пишем безопасный код на PHP. Часть 1

Опубликовано: 13 сен 2011 в 14:30
Автор: Dave Child  Перевод: freeeeez 

Эта статья является частью серии Пишем безопасный код на PHP. Из данной серии статей вы узнаете, как избежать некоторых наиболее распростаненных ошибок в PHP, и тем самым сделать ваш сайт более безопасным. PHP является очень простым языком для изучения и многие люди, даже не имея какого-либо технического образования, приступают к изучению этого языка. К сожалению, это часто означает, что такие начинающие PHP программисты не понимают потенциальных проблем в своих веб-приложениях. Вот несколько из наиболее распространенных проблем безопасности PHP-приложений.

Пишем безопасный код на PHP представляет собой серию статей.
Читайте также Часть 2, Часть 3 и Часть 4.

Первое правило: никогда не доверяйте своим пользователям

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

Итак, главное правило любого веб-разработчика: Никогда не доверять своим пользователям!

Глобальные переменные

Во многих языках программирования вы должны явно создать переменную для того, чтобы использовать ее. В PHP есть опция "register_globals", которую можно установить в php.ini или .htaccess. Данная опция позволяет использовать глобальные переменные без предварительного объявления.

Рассмотрим следующий код:
if ($password == "my_password") {
    $authorized = 1;
}
if ($authorized == 1) {
    echo "Lots of important stuff.";
}
Выглядит нормально, однако, при включенном "register_globals" достаточно дописать к URL "?authorized=1", что даст вам доступ к сайту в качестве авторизованного пользователя.

Этого можно избежать, отключив данную опцию. К счастью, на многих хостингах она отключена по умолчанию. Однако если вам все же необходимо использовать глобальные переменные, вам следует заранее объявлять такие важные переменные:
$authorized = 0;
if ($password == "my_password") {
    $authorized = 1;
}
if ($authorized == 1) {
    echo "Lots of important stuff.";
}

Сообщения об ошибках

Сообщения об ошибках полезны при отладке веб-приложений. Разработчики нуждаются в них, чтобы исправить ошибки, а хакеры могут использовать их для получения различной информации, такой как структура программы, версии сервера баз данных. Поэтому, после отладки своих приложений и запуске сайта необходимо отключить сообщения об ошибках. В .htaccess или php.ini следует выставить "error_reporting 0".

SQL-инъекции

Одной из самых сильных сторон языка PHP является легкое и быстрое взаимодействии с базами данных, в первую очередь с MySQL. Сейчас большинство сайтов построено в связке PHP+MySQL.

Однако, как и следовало ожидать, это повлекло за собой потенциальные проблемы безопасности веб приложений. Наиболее распространенными уязвимостями являются SQL-инъекции — несанкционированное исполнение SQL-запросов к базе данных.

Подробно о SQL инъекции и защите от нее я написал в статье Защита от SQL-инъекций.

Манипуляции с файлами

Многие сайты, которые сейчас работают в Интернете, имеют адреса, которые выглядят так:
index.php?page=contactus.html
Index.php подключает contactus.html. Здесь пользователь может очень легко изменить название файла на любое произвольное. Например, любой может увидеть ваш файл с паролями .htpasswd, если вы используете mod_auth Apache:
index.php?page=.htpasswd
Если у вашего сайта такая же структура страницы, проверьте правильно ли вы выставили “open_basedir” в вашем файле php.ini и создали “allow_url_fopen off”. Это позволит предотвратить большинство из этих видов атак, предотвращая включение удаленных и системных файлов. Далее, если есть возможность, установите ограничения на формат подключаемых файлов с помощью .htaccess.

Настройки по умолчанию

По умолчанию MySQL использует имя пользователя “root” с пустым паролем. SQL Server использует “sa”, как имя пользователя, также с пустым паролем. Если кто-нибудь найдет адрес вашего сервера баз данных и попробует войти в систему, это будут первые комбинации для проверки. Если вы не установите достаточно сложного пароля (а еще лучше новое имя пользователя), однажды вы можете обнаружить, что вся ваша база данных удалена или украдены номера кредитных карт пользователей. Тоже самое относиться и к программному обеспечению — всегда изменяйте дефолтные настройки и выставляйте сложные пароли.

Предсказуемость

Давайте представим на секунду, что ваш сайт привлек внимание одного вандала. Он хочет взломать вашу админку, чтобы просто написать на главной странице разные пакости. Не сложно догадаться, что первый адрес, по которому он зайдет, будет http://www.yoursite.com/admin/ или подобные этому. Ваша предсказуемость делает хакерам жизнь проще.

Помните об этом! Убедитесь, что называете ваши конфиденциальные файлы и папки сложными названиями. Например, админку можно разместить по адресу http://www.yoursite.com/jsfh8sfsifuhsi8392/ может это тяжелее для ввода, но добавляет дополнительный уровень безопасности вашего сайта. Для директории администратора выберите что-нибудь запоминающееся, но не слишком тривиальное. Более того, не следует ставить логин/пароль вроде 'admin' или 'administrator'. Придумайте сложный пароль и регулярно меняйте его.

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

Наконец, будте бдительны

Всегда предполагайте, что ваш сайт может находиться в опасности. Занимайтесь защитой своего сайта постоянно. Такая бдительность и внимательность позволит сохранить ваш сайт в безопасности.

Источник: Add Bytes внешняя ссылка
1 комментарий
6 587 просмотров


#1 Кир, 19 окт 2011 в 01:35
Спасибо за статьи, регулярно вас посещаю))) Порадовало, что сняли обязательную регистрацию для добавления комментариев - хотел и раньше написать коммент, но уже просто принципиально нигде не регистрируюсь - надоели тонны паролей.

Очень радуют ваши статьи. Просто и понятно. Точно и доступно.

А повесилило
"P.S. Если вы робот, то к сожалению вы
не сможете прочитать символы с картинки."

Оставить комментарий:

Имя:
Email:
Сайт:
Комментарий:

Допустимые теги: <em> • <strong> • <u> • <sub> • <sup> • <blockquote>

Проверочный код:

Введите проверочный код, для подтверждения, что вы не робот.
P.S. Если вы робот, то, к сожалению, вы
не сможете прочитать символы с картинки.