На многопользовательском сайте, насколько строго я должен проверять пароли своих пользователей?
Я искал немного, и я только нашел вопросы о как проверить пароли пользователей. Но я знаю как создавать соленые хэши для паролей для хранения в базе данных (PHP password_hash()
), и я знаю как проверить эти пароли (PHP
s password_verify()
).
Я спрашиваю, какие ограничения я должен устанавливать для пользовательских паролей на моем сайте. Поскольку пароли никогда не показываются на веб-странице, я должен наложить на них строгие ограничения, такие как имена пользователей?
Я знаю, что имена пользователей отображаются и уязвимы для XSS атаки (что я запретил для имен пользователей), но пароли разные, и не могут быть взломаны таким образом (я думаю, что это так, исправьте меня, если я ошибаюсь).
Я знаю, что пароли часто являются личными и очень уникальными. Я не знаю, следует ли мне ограничивать специальные символы, которые могли бы сделать пароль более безопасным, включая специальные символы, подобные тем, которые используются при атаке XSS.
Я спрашиваю, должен ли быть разрешен какой-либо пароль (в определенных пределах); если нет, то каков рекомендуемый (безопасный) метод?
Вы должны разрешить любые символы в наборе символов ASCII (хотя вы могли бы разрешить Unicode если вы хотите немного сложнее, например, при использовании измерителей надежности пароля). Если вы используете bcrypt, вы должны установить максимальную длину в 72 символа ASCII, поскольку реализация PHP ограничивает хеширование только этими символами:
Использование PASSWORD_BCRYPT для параметра algo приведет к усечению параметра пароля до максимальной длины до 72 символов.
Это хорошо, так как некоторые реализации накладывают большие ограничения на длину (55 символов).
С Юникодом это тоже сложнее, так как некоторые символы могут занимать до 4 байтов. Моя рекомендация: придерживайтесь ASCII, пароли могут быть достаточно безопасными (> = 64 бита энтропии), так как это упрощает задачу, и если ваши пользователи используют менеджеры паролей (что им и следует), большинство из них поддерживают только набор символов ASCII.
XSS является проблемой, только если данные выводятся на страницу. В идеале ваша система должна реализовывать политику, согласно которой пароли вводятся только когда-либо, но никогда не выводятся (даже в <input type="password" />
поля). Это повысит безопасность паролей в долгосрочной перспективе.
Во-первых, надежность пароля.
Это важно для предотвращения подбора пароля или взлома. Чем надежнее пароль — тем лучше. Например, вы можете ограничить его минимум 10 символами, указав в нем цифры и символы верхнего регистра. Это уже достаточно сильно, но вы также можете потребовать использование таких символов, как !
, $
, @
, #
и т. д. Этот пароль будет очень безопасным.
Что касается безопасного хранения пароля — это другая тема — и вы должны никогда сохранить или показать пароль в открытом виде. Всегда хэшируйте их, например:
$password = password_hash($password, PASSWORD_DEFAULT);
И сохраните полученную строку в базе данных.
Это считается самым безопасным сегодня.
Чтобы проверить правильность введенного пароля, все, что вам нужно сделать, это использовать функцию password_verify()
, чтобы сравнить введенный пароль с сохраненным хешированным.
$success = password_verify($entered_password, $hash_stored_in_mysql);
$success
станет true
или же false
это все, что вам нужно знать, если пароли совпадают или нет.
Так хорошо иметь это password_hash
а также password_verify
сегодня люди использовали так много глупых и неправильных способов хэширования или шифрования паролей, прежде чем были добавлены эти полезные функции!