Гриша К.
Новичок
Пример (теория) безопасной авторизации пользователей и администратора. Вопросы.
Авторизация пользователей с использованием html формы и сессий (без cookie).
Я сразу хотел бы узнать ваше мнение по поводу использования в качестве имени пользователя не Ник (который досутпен для посетителей), а e-mail пользователя, который ни где не отображается.
Предполагаемый вариант решения задачи:
(1) Пользователь заходит на страницу защищенную паролем, если он не авторизован, то перенаправляю его на страницу авторизации.
(2) На странице авторизации проверяю, только, чтобы все поля были заполнены, дальше выполняю запрос к БД.
(3) Если пользователь 10 раз ввел неверно пароль, то дальше для подтверждения того что авторизоваться пытается человек, а не машина, вывожу человекочитаемую надпись, на которой написан код подтверждения для ввода в форму. И после успешной авторизации, в течение часа всеравно требую вводить код подтверждения с картинки.
Для учета кол-ва попыток аворизации пользователя, каждую неудчаную попытку записываю в специальную таблицу user_danger (username, date, time)
(4) Веду журнал логов, делаю записи при каждой неудачной попытки авторизации - error_log('Логин, Пароль, REMOTE_ADDR, HTTP_X_REAL_IP', http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], 0). На 11 неверной попытке отправляю сообщение c ошибкой на e-mail - error_log('...', 1, "...@...")
Для авторизация администратора и модераторов использую тот же метод, что и для авториазции обычных пользователей, но после 3-ей неверной попытки блокирую пользователя с такими правами. Учетную запись для администратора и модераторов, создаю в отдельной от обычных пользователей таблицы БД.
Изученный материал:
http://phpclub.ru/detail/article/php_security1 - Безопасность статья 1
http://phpclub.ru/detail/article/php_security2 - Безопасность статья 2
http://phpclub.ru/detail/article/php_security3 - Безопасность статья 3
http://phpclub.ru/detail/article/2003-12-01 - Авторизация
http://phpclub.ru/detail/article/page_password1 - Пароль на страницу статья 1
http://phpclub.ru/detail/article/page_password2 - Пароль на страницу статья 2
http://phpclub.ru/talk/showthread.php?s=&threadid=79299 - Генрация изображений
http://phpclub.ru/talk/showthread.php?s=&threadid=78132 - Подбор пароля
И другое...
Авторизация пользователей с использованием html формы и сессий (без cookie).
Я сразу хотел бы узнать ваше мнение по поводу использования в качестве имени пользователя не Ник (который досутпен для посетителей), а e-mail пользователя, который ни где не отображается.
Предполагаемый вариант решения задачи:
(1) Пользователь заходит на страницу защищенную паролем, если он не авторизован, то перенаправляю его на страницу авторизации.
(2) На странице авторизации проверяю, только, чтобы все поля были заполнены, дальше выполняю запрос к БД.
(3) Если пользователь 10 раз ввел неверно пароль, то дальше для подтверждения того что авторизоваться пытается человек, а не машина, вывожу человекочитаемую надпись, на которой написан код подтверждения для ввода в форму. И после успешной авторизации, в течение часа всеравно требую вводить код подтверждения с картинки.
Для учета кол-ва попыток аворизации пользователя, каждую неудчаную попытку записываю в специальную таблицу user_danger (username, date, time)
(4) Веду журнал логов, делаю записи при каждой неудачной попытки авторизации - error_log('Логин, Пароль, REMOTE_ADDR, HTTP_X_REAL_IP', http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], 0). На 11 неверной попытке отправляю сообщение c ошибкой на e-mail - error_log('...', 1, "...@...")
Для авторизация администратора и модераторов использую тот же метод, что и для авториазции обычных пользователей, но после 3-ей неверной попытки блокирую пользователя с такими правами. Учетную запись для администратора и модераторов, создаю в отдельной от обычных пользователей таблицы БД.
----------------------------------------ВОПРОСЫ
[1] - Данные вводимые пользователем я обрабатываю так: удаляю лишние пробелы - trim(); прослэшиваю в запросе к БД - mysql_real_escape_string(); пароль шифрую - MD5(). В статье "Приемы безопасного программирования веб-приложений на PHP", в имени пользователя запрещается вводить любые символы, кроме букв русского и латинского алфавита, знака "_" (подчерк), пробела и цифр. Допустимо ли не ограничивать таким образом имя пользователя (логин) при регистрации и соответсвенно авторизации?
[2] - Как лучше осуществлять чистку таблицы (user_danger), в которую записываются все неудачные попытки авторизации? Так как обращаться к этой таблице придется при каждом запросе, то сразу же смотреть, если есть ли записи для данного пользователя сделанные не раньше 1 часа назад и при успешной авторизации такие записи удалять.
[3] - Как защититься от перегрузки сервера (DOS-аттака)? Так как запрос к БД, на проверку кол-ва неверных авторизаци будет осуществляться всегда, то возможно что на страницу авторизации могут сделать к примеру 1000000 обращений, что может повлиять на работо способность сервера. Я предполагаю делать задержку выполнения сценария после 10 неудачной авторизации - sleep(2)
Изученный материал:
http://phpclub.ru/detail/article/php_security1 - Безопасность статья 1
http://phpclub.ru/detail/article/php_security2 - Безопасность статья 2
http://phpclub.ru/detail/article/php_security3 - Безопасность статья 3
http://phpclub.ru/detail/article/2003-12-01 - Авторизация
http://phpclub.ru/detail/article/page_password1 - Пароль на страницу статья 1
http://phpclub.ru/detail/article/page_password2 - Пароль на страницу статья 2
http://phpclub.ru/talk/showthread.php?s=&threadid=79299 - Генрация изображений
http://phpclub.ru/talk/showthread.php?s=&threadid=78132 - Подбор пароля
И другое...