Regex для пароля PHP

Я нашел скрипт онлайн, и у него есть регулярное выражение паролей в JavaScript. Я все еще хочу использовать его, но для большей безопасности я хочу использовать PHP для проверки моего пароля, но я бесполезен с регулярным выражением.

Требования:

  • Должно быть не менее 8 символов
  • Должен содержать как минимум 1 номер
  • Должен содержать хотя бы один символ верхнего регистра
  • Должен содержать хотя бы один строчный символ

Как я могу построить строку регулярных выражений для удовлетворения этих требований?

Я нахожу, что делать это в одном большом регулярном выражении – это немного кошмар для поддержания кода. Разделить его гораздо легче понять, если кто-то еще смотрит на ваш код, и он позволяет вам давать более конкретные сообщения об ошибках.

$uppercase = preg_match('@[AZ]@', $password); $lowercase = preg_match('@[az]@', $password); $number = preg_match('@[0-9]@', $password); if(!$uppercase || !$lowercase || !$number || strlen($password) < 8) { // tell the user something went wrong } 
 ^\S*(?=\S{8,})(?=\S*[az])(?=\S*[AZ])(?=\S*[\d])\S*$ 

От прекрасных людей в Зорхед .

  • ^ : привязано к началу строки
  • \S* : любой набор символов
  • (?=\S{8,}) : не менее длины 8
  • (?=\S*[az]) : содержит хотя бы одну строчную букву
  • (?=\S*[AZ]) : и по крайней мере одна буква в верхнем регистре
  • (?=\S*[\d]) : и хотя бы одно число
  • $ : привязано к концу строки

Чтобы включить специальные символы, просто добавьте (?=\S*[\W]) , которые не являются символами слова.

Один из возможных шаблонов регулярных выражений:

 /^(?=.*[az])(?=.*[AZ])(?=.*\d)[a-zA-Z\d]{8,}$/ 

Как в этом примере .

Но вы действительно не должны ограничивать пароли!

введите описание изображения здесь

Признай это. Как разработчик, мы сделали больше, чтобы внести свой вклад в провал онлайн-безопасности наших клиентов и пользователей, потому что мы слишком упрямы или ленивы, чтобы правильно обрабатывать пароли. Посмотрите на некоторые плоды нашего труда:

Длина пароля должна быть от 5 до 32 символов. Допустимые символы включают буквы, цифры и подчеркивание.

Длина пароля должна быть от 6 до 12 символов. Допустимые символы включают буквы и цифры.

Пароль должен содержать не менее 8 символов и содержать по крайней мере одну заглавную букву, номер и специальный символ, например подчеркивание или восклицательный знак.

Тогда есть этот камень. Первоначальные требования составляли не менее 8 символов. Случайное включение 7 символов приводит к появлению ошибки перед пользователем:

введите описание изображения здесь

Ограничение пароля Gone Wrong Обратите внимание на строку тега. Иронии?

Я мог бы продолжить здесь, но, думаю, вы понимаете. Мы написали код, чтобы поддержать эту бессмыслицу, обертывая головы вокруг правильного регулярного выражения для учета каждого случая. Агонизация по передаче, хешированию и хранению. Мы говорили об этом так, что ситуация даже получила надлежащий статус поп-культуры с ее мемориализацией на xkcd.

Нет никаких сомнений в том, что наши намерения были хорошими. В конце концов, пользователи и клиенты не могут должным образом защитить себя. Они не создают надежных паролей, они чаще используют слово «пароль» в качестве пароля. Они не прислушиваются к предупреждениям, новостям или ужасу, с которыми сталкиваются друзья, которые пострадали от кражи личных данных. Взлом крупных розничных сетей их очень мало фазирует. Мы, как разработчики, решили помочь нашим пользователям избежать этих ошибок. Я соглашусь на то, что наши попытки не оправдались и, возможно, даже способствовали этой проблеме.

Скорее всего, мы сделали это хуже.

Помещая тайные ограничения на пароли, мы фактически заставили наших пользователей плохо думать и поэтому заставили их искать путь наименьшего сопротивления, простые взломанные пароли. Мы сделали это, потому что мы привыкли к ограничениям для нас. Сисадмины ограничили нас до 8 символов, поэтому мы проецировали предел на остальной мир. Настало время, когда мы остановились и узнали, как обращаться с любой длиной пароля с любым включенным символом. Мы можем исключить пробелы из пароля, но кроме этого мы не должны устанавливать никаких ограничений на пароли.

Затем мы можем поощрять хорошие методы безопасности, такие как фразы или случайные слова. Пользователи, узнав об этом, будут счастливы, что им не нужно помнить какую-то туповатую комбинацию букв и цифр, например f @ rtp00p.

Я вижу, что ты закатываешь глаза. Это означает, что вам нужно узнать, как правильно использовать хэш-пароли и как сравнивать введенные пароли с хэшами. Вам придется бросить какое-то действительно тяжелое завоеванное регулярное выражение. Не дай бог, вам придется переработать какой-то код! Базы данных могут содержать очень большие хэшированные пароли, и мы должны воспользоваться возможностями.

Имейте в виду, что общая безопасность данных на мне, разработчик вместе с системным администратором и другими. Безопасность учетной записи пользователя на них, и я не должен ничего делать, чтобы удерживать их. Лично мне все равно, что мои пользователи имеют для своих паролей. Все, что я делаю, когда пользователи создают свои пароли, представляет собой измеритель силы и некоторые основные рекомендации:

«Мы обнаружили, что использование кодовых фраз или нескольких комбинаций слов является самым безопасным, когда дело доходит до того, что хакер, который пытается взломать вашу регистрационную информацию, не может быть успешным».

Что вы должны сделать?

Встроенные функции PHP отлично управляют безопасностью паролей, пробелами, специальными символами и т. Д. Если вы используете версию PHP менее 5.5, вы можете использовать пакет совместимости password_hash() .

Нам нужно удалить ограничения на пароли и освободить пользователей для их безопасности в Интернете. Вы в?

Регулярное выражение PHP для надежной проверки пароля

Ссылка выше выглядит как регулярное выражение, которое вы хотите. Вы можете попробовать что-то вроде кода ниже:

 if(preg_match((?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[AZ])(?=.*[az]).*$), $_POST['password']): echo 'matched'; else: echo 'not matched'; endif; , if(preg_match((?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[AZ])(?=.*[az]).*$), $_POST['password']): echo 'matched'; else: echo 'not matched'; endif; 

Это проверяет мин. 1, а также min / max:

 ^(?=.*\d)(?!.*\s).{4,8}$