21 ошибка программиста PHP. Часть 2
Страница 11. Недостаточное внимание к вопросам безопасности


8. Недостаточное внимание к вопросам безопасности

Пользователи никогда не будут работать по нашим правилам. Поэтому создание системы устойчивой и терпимой к ошибкам - целиком и полностью ответственность разработчиков, то есть нас.

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

Пример: многие скрипты не используют встроенную PHP-функцию mail(), которая обеспечивает безопасную отправку почты. Вместо этого почта отправляется через программу sendmail с помощью popen(). Это делает код весьма неустойчивым к искажению данных и представляет собой "дыру" в безопасности системы (получателю можно отправить /etc/passwd).

Перечислим наиболее распространённые "дыры", позволяющие искажать данные:

  • системные вызовы. Никогда нелишне повторить. Каждый раз нужно убедиться, сто пользователь отправляет вам "безопасные" данные для системного вызова. НИКОГДА НЕ ДОВЕРЯЙТЕ ДАННЫМ, ПОЛУЧЕННЫМ ОТ ПОЛЬЗОВАТЕЛЯ. И ПРЕЖДЕ ЧЕМ ПОДСТАВИТЬ ИХ В СИСТЕМНЫЙ ВЫЗОВ ПРОВЕРЬТЕ ИХ.
  • регистрация пользователей. Если вы желаете получить корректные результаты, обязательно проверяйте полученные данные, причём, лучше если проверка будет состоять из нескольких этапов. Прежде всего, это проверка адреса электронной почты: убедитесь, что пользователь предоставил вам работающий аккаунт. Кроме того, стоит убедиться, что указанный возраст находится в определённых пределах. Вы можете быть совершенно уверены, что на нашей планете нет двухсотлетних товарищей, которые ещё способны сесть за компьютер.
  • Приём номеров кредитных карточек. Некоторые программисты ограничиваются самыми простыми алгоритмами; их легко обмануть. Существуют крупные специализированные организации для проверки кредитных карточек; рекомендуем прибегать к их помощи или ресурсам и только потом решать, принята карточка или нет. НИКОГДА НЕ ПОЛАГАЙТЕСЬ ТОЛЬКО НА АЛГОРИТМЫ.

Безопасность системных вызовов.

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

Каждый раз при системном вызове с потенциально небезопасными данными, дезактивируйте их с помощью EscapeShellCmd():

Примечание: дезактивация проходит путём подстановки бэкслэша ("\") перед потенциально небезопасными для системы символами (а именно: #&;?'\"|*?~<>^()[]{}$\\\x0A\xFF).

<html>
<head>
<title>Поиск аккаунта</title>
</head>
<body>
<h1>Поиск аккаунта</h1>
<?php
if ($name) {
    
system (EscapeShellCmd ("lookup $name"));
    print
"<br>\n\n";
}
?>
<form action="<?php print $PHP_SELF; ?>" method="GET">
Введите аккаунт для поиска:
<input type="text" name="name">
<input type="submit" value="Найти аккаунт">
</form>
</body>
</html>

Примечание: хотя EscapeShellCmd() - функция чрезвычайно полезная, когда вам нужно убедиться в безопасности полученных данных, всегда стоит проводить специальные проверки в зависимости от вида данных. EscapeShellCmd() не проверит данные на корректность, она лишь предотвратит неавторизованные действия пользователя.

Усиленная проверка данных

Как правило, лучше проверять строку на наличие допустимых символов, нежели на отсутствие недопустимых.

Например, проверить, что переменная $name содержит только буквенные символы. При этом новые пути проникновения в систему имеют меньше шансов просочиться через ваш фильтр.

Проверка адресов электронной почты

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

  • проверка соединения
  • интерактивная проверка

Проверка соединения

Один из способов проверки аккаунта на достоверность без привлечения самого пользователя - это попробовать открыть соединение с сервером, указанным в полученном адресе и проверить наличие аккаунта на данном сервере.

Плюсы

  • Никаких действий со стороны пользователя, поскольку операция проводится на программном уровне.
  • Выявляет несуществующие адреса, с чем никогда не справится регулярное выражение (например, Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ).

Минусы

  • Выявляются только несуществующие адреса. Например, если John Doe пошлёт e-mail автора этих строк ( Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ), данные будут приняты, несмотря на то, что был предоставлен неверный адрес.
  • Данный метод работает медленнее, чем регулярные выражения.
  • Почтовый сервер пользователя может временно не работать, при этом рабочий адрес будет восприниматься как некорректный.

Интерактивная проверка

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

Плюсы

  • Лучший способ убедиться, что пользователь предоставил корректный и свой адрес (Пользователь должен иметь доступ к аккаунту, указанному при регистрации).

Минусы

  • Требуются некоторые действия со стороны пользователя. Это раздражает тех, кто пытается вас одурачить.
  • Как и любой другой, этот способ не даёт стопроцентной гарантии надёжности. Пользователь может создать временный аккаунт на Hotmail или Netaddress, а потом дать его при регистрации. 

 
« Предыдущая статья   Следующая статья »