Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #30, МАЙ 2003 г.

PHP-BugZ

ManderX

Спецвыпуск Xakep, номер #030, стр. 030-020-3


[Аутентификация]

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

Допустим, из формы мы получили $login и $pass. Так как $login будет употреблятся в SQL-запросе, то надо профильтровать переменную:

$login = mysql_escape_string($login);

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

$login_id = mysql_query("SELECT id FROM user WHERE login='$login' AND pass='". md5($pass). "'");

Из запроса получаем ИД юзера с логином $login и пассом $pass. Но это далеко не все, мы должны проверить (вдруг хацкер оставит пустым поле введения пароля) кол-во записей в результате запроса (результат запроса - $login_id), если функция возвращает 1, то все Ок, пропускаем юзера к нам, если нет – красиво посылаем=):

if (mysql_num_rows($login_id) !=1) {

echo “Тут можешь написать свою речь к сообществу хакеров=)”

}

else {

#Тут делаем все что и хотим, пускаем в запретную зону, прежде сгенерировав сешен ид или записав в кукисы пасс.

}

Вот пожалуй общая схема авторизации, конечно не мешало бы проверять на ошибки mysql, но тема статьи – Security=). Можно еще добавить - когда проверяешь пароль в кукисах, не забывай, что пользователь кукисы может заменить и их надо также проверять по выше описанной схеме.

[Рекомендации по настройке php]

1. Запретить создание глобальных переменных из пользовательского ввода:

register_globals off

2. Включить режим safe_mode:

safe_mode on (в режиме safe_mode PHP проверяет владельца запущенного скрипта, и если скрипт пытается открыть какой-либо файл - делает это с правами этого владельца).

3. Ограничения на каталоги

doc_root = /home/USER/htdocs

Если PHP сконфигурирован для работы в safe mode, то файлы, лежащие вне этого каталога, не будут обрабатываться.

open_basedir = /home/USER/htdocs

Ограничивает область файлов, которые может открыть PHP только в заданном дереве каталогов. Когда скрипт пытается открыть файл (например, fopen) проверяется его расположение. Если файл находиться за указанным деревом, PHP откажет в его открытии.

Назад на стр. 030-020-2  Содержание  Вперед на стр. 030-020-4