Как мне избежать или очистить пароли, предоставленные пользователем, прежде чем я их хэширую и сохраню в своей базе данных?
Когда разработчики PHP рассматривают хеширование паролей пользователей в целях безопасности, они часто склонны думать об этих паролях, как о любых других данных, предоставленных пользователем. Эта тема часто возникает в вопросах PHP, связанных с хранением паролей; разработчик часто хочет очистить пароль, используя такие функции, как escape_string()
(в различных итерациях) htmlspecialchars()
, addslashes()
и другие перед его хешированием и сохранением в базе данных.
Ответы:
Вы никогда не должны избегать, обрезать или использовать какой-либо другой механизм очистки паролей, которые вы будете хешировать с помощью PHP,
password_hash()
по ряду причин, самая большая из которых заключается в том, что для дополнительной очистки пароля требуется ненужный дополнительный код.Вы будете утверждать (и вы видите это в каждом посте, в котором пользовательские данные принимаются для использования в ваших системах), что мы должны очищать весь пользовательский ввод, и вы будете правы в отношении любой другой информации, которую мы принимаем от наших пользователей. Пароли разные. Хешированные пароли не могут представлять угрозу SQL-инъекций, потому что строка превращается в хэш перед сохранением в базе данных.
Хеширование пароля - это действие по обеспечению безопасности пароля для хранения в вашей базе данных. Хеш-функция не придает особого значения никаким байтам, поэтому по соображениям безопасности очистка входных данных не требуется.
Если вы следуете мантрам, разрешающим пользователям использовать пароли / фразы, которые они хотят, и вы не ограничиваете пароли , разрешая любую длину, любое количество пробелов и любые специальные символы, хеширование сделает пароль / кодовую фразу безопасным, независимо от того, что содержится в пароль. На данный момент наиболее распространенный хеш (по умолчанию)
PASSWORD_BCRYPT
превращает пароль в строку шириной 60 символов, содержащую случайную соль вместе с хешированной информацией о пароле и стоимостью (алгоритмической стоимостью создания хеша):Требования к пространству для хранения хэша могут меняться по мере добавления к функции различных методов хеширования, поэтому всегда лучше увеличивать тип столбца для сохраненного хеша, например
VARCHAR(255)
илиTEXT
.Вы можете использовать полный запрос SQL в качестве пароля, и он будет хеширован, что сделает его невыполнимым механизмом SQL, например,
Может быть хеширован
$2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
Посмотрим, как различные методы очистки влияют на пароль -
Пароль
I'm a "dessert topping" & a <floor wax>!
(В конце пароля есть 5 пробелов, которые здесь не отображаются.)Когда мы применяем следующие методы обрезки, мы получаем совершенно разные результаты:
Полученные результаты:
Что происходит, когда мы отправляем их
password_hash()
? Все они хешируются, как и запрос выше. Проблема возникает, когда вы пытаетесь проверить пароль. Если мы используем один или несколько из этих методов, мы должны повторно использовать их, прежде чем сравнивать ихpassword_verify()
. Следующее не получится:Вам нужно будет запустить опубликованный пароль с помощью выбранного вами метода очистки, прежде чем использовать результат этого при проверке пароля. Это ненужный набор шагов, и он не сделает хэш лучше.
Используете версию PHP ниже 5.5? Вы можете использовать
password_hash()
пакет совместимости .Вам действительно не следует использовать хэши паролей MD5 .
источник
Перед хешированием пароля вы должны нормализовать его, как описано в разделе 4 RFC 7613 . В частности:
и:
Это пытается гарантировать, что если пользователь вводит тот же пароль, но использует другой метод ввода, пароль все равно должен быть принят.
источник