Октябрь 27, 2005
Приемы безопасного веб-программирования на PHP
Данная статья не претендует на роль всеобъемлющего руководства на тему "как сделать так, чтоб меня никто не поломал".
Единственная цель этой статьи - показать некоторые используемые мной приемы для защиты веб-приложений типа WWW-чатов, гостевых книг, веб-форумов и других приложений подобного рода. Итак, давайте рассмотрим некоторые приемы программирования на примере некоей гостевой книги, написанной на PHP.
Первой заповедью веб-программиста, желающего написать более-менее защищенное веб-приложение, должно стать "Никогда не верь данным, присылаемым тебе пользователем". Пользователи - это по определению такие злобные хакеры, которые только и ищут момента, как бы напихать в формы ввода всякую дрянь типа PHP, JavaScript, SSI, вызовов своих жутко хакерских скриптов и тому подобных ужасных вещей. Поэтому первое, что необходимо сделать - это жесточайшим образом отфильтровать все данные, присланные пользователем.
Допустим, у нас в гостевой книге существует 3 формы ввода: имя пользователя, его e-mail и само по себе тело сообщения. Прежде всего, ограничим количество данных, передаваемых из форм ввода чем-нибудь вроде:
<input type=text name=username maxlength=20>
На роль настоящей защиты, конечно, это претендовать не может - единственное назначение этого элемента - ограничить пользователя от случайного ввода имени длиннее 20-ти символов. А для того, чтобы у пользователя не возникло искушения скачать документ с формами ввода и подправить параметр maxlength, установим где-нибудь в самом начале скрипта, обрабатывающего данные, проверку переменной окружения web-сервера HTTP-REFERER:
<?
$referer=getenv("HTTP_REFERER");
if (!ereg("^http://www.myserver.com")) {
echo "hacker? he-he...\n";
exit;
}
?>
Теперь, если данные переданы не из форм документа, находящегося на сервере www.myserver.com, хацкеру будет выдано деморализующее сообщение. На самом деле, и это тоже не может служить 100%-ой гарантией того, что данные ДЕЙСТВИТЕЛЬНО переданы из нашего документа. В конце концов, переменная HTTP_REFERER формируется браузером, и никто не может помешать хакеру подправить код браузера, или просто зайти телнетом на 80-ый порт и сформировать свой запрос. Так что подобная защита годится только от Ну Совсем Необразованных хакеров. Впрочем, по моим наблюдениям, около 80% процентов злоумышленников на этом этапе останавливаются и дальше не лезут - то ли IQ не позволяет, то ли просто лень. Лично я попросту вынес этот фрагмент кода в отдельный файл, и вызываю его ото всюду, откуда это возможно. Времени на обращение к переменной уходит немного - а береженого Бог бережет.
продолжение следует...
Разместил:
Автор:
Комментарии
- 1. 28.10.05 02:13 От: Арсен Кириллов
-
С реферер - перебор. Это не метод защиты, хотя бы потому, что тем же curl'ом обходится в три строки. Конечно, класно про него вспомнить - но все же. Еще бы рекомендовл обратить внимание на php.net. Там в начале года проходила довольно резкая статья по поводу безопасности и ошибок в php-enjine.
http://softm.h1.ru/
- 2. 28.10.05 15:11 От: MiRacLe
-
Небольшое отступление:
вот из-за таких "недалёких" советчиков и пишут направо и налево "кривые" приложения....
А о том что referer может банально "резаться" различными локальными файрволами, корпоративными прокси и т.п. сетевыми фильтрами автор не знал ?
И все пользователи, установившие у себя Norton Какой-то-там Firewall просто идут лесом, затем полем и в конце концов забывают о сайте на который его не пустил "крайне умный" разработчик.
Теперь о главном - referer надо проверять только в том случае если он ЕСТЬ! не надо так же забывать о том что в большинстве случаев www.domain.tld и domain.tld это один и тот же ресурс и в зависимости от настроек сервера форма отправленная с domain.tld может попадать в обработку на www.domain.tld (или наоборот) соответственно проверка любезно опубликованная автором опять-таки огорчит потенциального писателя опуса в гостевой книге сообщением о том что он hacker.....
Итог - прежде чем нажимать на кнопку "Опубликовать" автору рекомендуется попить чаю. Если после этого снова возникнет желание поучать других - повторить историю с чаем....
- 3. 29.10.05 17:45 От: in
-
Согласен с MiRacLe. Это не защита! Это видимость и самоуспокоение. Тут недавно закончилась Zend/PHP Conference 2005. Там были очень серьезные доклады по защите. Жалко, из России там был только один человек (насколько мне известно). Дождемся, когда он напишет эссе по материалам данной конференции: http://www.phpworld.ru/