#regex #passwords
#регулярное выражение #пароли
Вопрос:
Я ищу единственное регулярное выражение для наших требований к паролю. Пароли:
- Должно содержать не менее 8 символов
- Не может содержать пробелы
- Содержит как строчные, так и ПРОПИСНЫЕ символы
- Содержит хотя бы одну цифровую цифру
- Содержит по крайней мере один специальный символ (т. Е. любой символ, которого нет
0-9,a-z,A-Z
)
Комментарии:
1. Это ужасное использование регулярных выражений. Это так просто сделать вручную. Я бы не советовал использовать regex для этого.
2. Я вижу комбинаторный взрыв…
3. Повторное требование к нему в одном выражении делает его сложным и очень трудным для чтения человеком, которому приходится его поддерживать. Я предлагаю разделить его на разные тесты, чтобы сделать его более удобным в обслуживании. Вы также забыли упомянуть, какой движок регулярных выражений вы используете, поскольку есть различия с тем, что вы могли бы сделать. В зависимости от того, где выполняется тест, может быть интересно сообщить пользователю о причине сбоя пароля.
4. Актуально — thedailywtf.com/Articles/Security-by-PostIt.aspx
Ответ №1:
Вероятно, будет проще закодировать логику. Регулярное выражение используется для сопоставления шаблонов. Пароли, как правило, представляют собой несколько случайных строк, поэтому проблему нелегко решить с помощью регулярного выражения. Это возможно, но будет непонятно для чтения и сложно поддерживать.
Ответ №2:
Идея и большая часть работы взяты из http://www.zorched.net/2009/05/08/password-strength-validation-with-regular-expressions /
^S*(?=S{8,})(?=S*[a-z])(?=S*[A-Z])(?=S*[d])(?=S*[W])S*$
Я использовал базовый ответ внизу его поста, но заменил все точки на S
, чтобы исключить пробелы, и изменил некоторые утверждения.
Комментарии:
1. Почти 1. Статья, на которую дана ссылка, хорошая, но в ней ошибочно предлагается использовать
.*
звездочку с точкой в начале выражения (это не обязательно, потому что звездочка с точкой в конце будет соответствовать строке). Хотя это не наносит вреда для этой конкретной проблемы (ваш ответ правильный и работает нормально), это приведет к сбою, если существует верхний предел длины пароля. Если требование к длине составляет от 8 до 12 символов, то правильным выражением было бы:^(?=.{8,12}$)(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*W)S*$
(Обратите также внимание, что в предпросмотре нет необходимости вS
.) В остальном хороший ответ.