Как реализовать систему входа в систему для веб-приложений?
Я пишу систему входа для сайта, который я создаю.
Вот суть того, как я внедряю систему входа в систему:
У меня есть две таблицы: пользователи и сеансы.
users: uid | uname | pass
sessions: sid | uid | ts | ts_expires
Таким образом, пользователь вводит комбинацию uname/pass.
- Если комбинация неверна, я перенаправляюсь на страницу "плохой авторизации".
- если комбинация правильная, I:
- генерирует случайный sessionid (
sid
)
- вставьте запись в
sessions
, связывая этот sid с uid от имени пользователя.
- установите cookie с именем
sid
со значением случайного sid
, только что вставленного в sessions
.
На каждой странице, которая требуется для входа пользователя в систему, я проверяю:
- установлен ли файл cookie
- если sid действителен
Итак, мои вопросы:
- Какие могут быть проблемы с этим механизмом?
- Как должна быть реализована хорошая система входа?
PS: Я еще не пользуюсь защищенным паролем. Так что это единственная проблема, которую я сейчас вижу. И о, я использую php и mysql, если это актуально.
EDIT: я храню пароли не в обычном тексте, а как MD5 имени пользователя, связанного с паролем.
Итак, pass = MD5($uname.$pass)
, так сказать.
Ответы
Ответ 1
Хеш этот пароль, с солью! Используйте сильный хэш, например, bcrypt. Если вам нужно использовать MD5/SHA, используйте метод растяжения и хэша, который он хэширует несколько тысяч раз. Пользователю все равно, потребуется ли секунда, чтобы проверить свой пароль вместо 1/1000, но взломщик грубой силы будет.
Выполняет запись и предотвращает попытки грубой силы.
Будьте очень осторожны, когда вы храните учетные данные пользователя после входа в систему. Вы не хотите, чтобы они меняли его.
И используйте SSL!
Ответ 2
Чтобы замедлить атаку грубой силы, принудительно задержка после неудачной попытки; то есть, если кто-то дает вам неправильный пароль, подождите три секунды, прежде чем отображать следующий экран с "сбой пароля".
Ответ 3
Разработка и внедрение безопасной, надежной и удобной системы входа в систему на самом деле довольно сложно получить с первой попытки. Страницы на страницах написаны по этой теме - слишком обширны, чтобы лечить правильно, здесь.
Хорошей отправной точкой является www.owasp.org. Затем привлеките кого-то, с кем работаете, хорошо осведомлены о безопасности, договоритесь с охранной компанией (например, www.matasano.com, veracode.com или neohapsis.com - я работал со всеми тремя, и все три очень хороши), и/или задавать вопросы в списках рассылки безопасности (например, список безопасности веб-приложений, указанный в securityfocus.com).
Ответ 4
Как правило, правильная практика заключается в том, чтобы хранить пароль в виде соленого одностороннего хеша фактического пароля, а не хранить его в виде открытого текста. Вы не указали, делаете вы это или нет, но если нет, сделайте это.
Убедитесь, что логин имеет период ожидания, поэтому он не будет длиться вечно.
Убедитесь, что файл cookie удален при выходе из системы.
Не забывайте, что пользователь может войти в систему с общедоступного компьютера и что сохранение учетных данных для входа в качестве файла cookie может привести к тому, что последующий пользователь получит доступ через заброшенный сеанс.