PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: валидатор пароля
NeuroZ
Отправлено: 06 Октября, 2016 - 17:34:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Помогите, пожалуйста, написать регулярку валидации пароля.
Опыта в написании регулярок крайне мало...
Условие: Пароль должен содержать хотя бы 1 букву и цифру и быть длиной от 6 до 16
На ум приходит что-то вроде
/^(а вот что тут должно быть - не пойму...){6,16}$/i
 
 Top
Fart
Отправлено: 06 Октября, 2016 - 18:18:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 324
Дата рег-ции: Июль 2016  


Помог: 10 раз(а)




пускай лучше сам пользователь будет выбирать какой пароль, а ты только проверяй насколько длинный он. в фронт-энде можешь проверять какие символы вводит.

при получении вводимого пароля

---используешь одну из функций strlen, iconv_strlen
---проверяешь сколько символов
---далее используешь md5(пароль.соль)

а там какие символы ввел пользователь забей и к тому же получишь чуть чуть безопасности связанные с паролями.

(Отредактировано автором: 06 Октября, 2016 - 18:19:18)

 
 Top
NeuroZ
Отправлено: 07 Октября, 2016 - 09:43:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Fart пишет:
в фронт-энде можешь проверять какие символы вводит.

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

Про формирование паролей и безопасность я как раз в курсе.
Еще я в курсе, что регулярки - это еще те капканы... Всегда есть вариант что-то упустить.

Но всё же хочется, чтобы взлом аккаунтов пользователей сводился к минимуму. Поэтому одно из требований - такие пароли. Понятно, что это не панацея, но всё же лучше, чем просто проверять на длину.
 
 Top
Мелкий Супермодератор
Отправлено: 07 Октября, 2016 - 09:53:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11888
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 614 раз(а)




NeuroZ пишет:
одно из требований - такие пароли

NeuroZ пишет:
16}$/i

Ну-ну.

Если есть явное требование предметной области (работа с деньгами и/или конфиденциальными данными) - проверяйте минимальную сложность пароля. Но никогда не ограничивайте максимальную.

Операция редкая, но связана с безопасностью. Значит должна иметь очевидное поведение. Если вы плохо знаете регулярки, то лучше будет максимально простой вариант:
PHP:
скопировать код в буфер обмена
  1. $isAllowed = (mb_strlen($pass) > 6);
  2. if (! preg_match('~\d~', $pass)) {
  3.     // нет цифр
  4.     $isAllowed = false;
  5. }
  6. if (! preg_match('~[a-zа-яё]~', $pass)) {
  7.     // нет букв
  8.     $isAllowed = false;
  9. }
  10. if (! preg_match('~[A-ZА-ЯЁ]~', $pass)) {
  11.     // нет заглавных букв
  12.     $isAllowed = false;
  13. }


Fart пишет:
---далее используешь md5(пароль.соль)

md5 не имеет и никогда не имел отношения к паролям. Это быстрый метод хеширования для создания отпечатка и верификации корректности данных.
password_hash


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 07 Октября, 2016 - 10:03:40
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Мелкий пишет:
Если вы плохо знаете регулярки, то лучше будет максимально простой вариант:

Да, у меня проскакивала такая мысль, но это как-то не по феншую.. рука не поднималась так написать...
(Добавление)
Мелкий пишет:
и никогда не имел отношения к паролям

Очень много CMS в свое время хранили пароли в формате md5() или md5(md5())
*Но я не имею в виду, что это хорошая практика

(Отредактировано автором: 07 Октября, 2016 - 10:26:13)

 
 Top
Мелкий Супермодератор
Отправлено: 07 Октября, 2016 - 11:31:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 11888
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 614 раз(а)




PHP:
скопировать код в буфер обмена
  1. $testcases = [
  2.     '' => 0,
  3.     'asgh' => 0,
  4.     'ajfghfg1' => 0,
  5.     'ajfghfg1FD' => 1,
  6.     'g1FD' => 0,
  7. ];
  8. $regex = '~^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{7,}~';
  9. $fail = 0;
  10. foreach ($testcases as $input => $need) {
  11.     if (preg_match($regex, $input) !== $need) {
  12.         echo 'fail '.$input,PHP_EOL;
  13.         ++$fail;
  14.     }
  15. }
  16. echo 'fails '.$fail;

От непонятно как работающего кода стало легче?

NeuroZ пишет:
Очень много CMS в свое время хранили пароли в формате md5() или md5(md5())

И токены генерируют rand'ом, и много более серьёзные дыры оставляют. Это не делает md5 стойким хэшом.


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 07 Октября, 2016 - 11:46:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Мелкий пишет:
От непонятно как работающего кода стало легче?

Ну почему же непонятного?
Начиная с любого символа кроме пробела с кол-вом вхождений от 0 и больше должна идти хотя бы 1 буква латинского алфавита в нижнем регистре, после чего хотя бы 1 буква в верхнем регистре, после чего хотя бы 1 цифра, потом любой набор символов и всё это дело должно состоять минимум из 7 знаков
Единственное - не понятно что означает ~ и почему не /regex/
(Добавление)
У меня кстати нечто похожее получилось написать (заглавные буквы не учитываю), вот только не пойму как в данному примере установить условие на кол-во символов...
PHP:
скопировать код в буфер обмена
  1. /((?<=\d)[a-z])|((?<=[a-z])\d)/i

Еще понял свою ошибку в чтении Вашей регулярки... Последовательность (?=) не означает строгое соответствии следования друг за другом? Так, например, эта регулярка подходит под выражение с заглавной буквы, после которой идет цифра, а потом все строчные буквы.
(Добавление)
p.s. Спасибо за работающее решение
(Добавление)
p.p.s. А можете объяснить как ограничить число символов в моей регулярке?

(Отредактировано автором: 07 Октября, 2016 - 12:20:05)

 
 Top
Мелкий Супермодератор
Отправлено: 07 Октября, 2016 - 12:06:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 11888
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 614 раз(а)




NeuroZ пишет:
Ну почему же непонятного?
Начиная с любого символа кроме пробела с кол-вом вхождений от 0 и больше должна идти хотя бы 1 буква латинского алфавита в нижнем регистре, после чего хотя бы 1 буква в верхнем регистре, после чего хотя бы 1 цифра, потом любой набор символов и всё это дело должно состоять минимум из 7 знаков

Вот я и говорю - непонятно как работающий код. Регулярку вы поняли неверно. Значит и далее здесь будут проблемы.

В регулярке написано: в последующем тексте в любом месте должна быть хотя бы одна буква a-z, хотя бы одна цифра, хотя бы один A-Z. Строка не меньше 7 символов. Никаких утверждений о следовании символов нет. Про пробел тем более ничего не сказано.

NeuroZ пишет:
что означает ~ и почему не /regex/

Личное предпочтение. Ограничитель может быть любым из довольно большого списка.


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 07 Октября, 2016 - 12:10:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Мелкий пишет:
Про пробел тем более ничего не сказано.

тут я извиняюсь... в голове держал одно, а написал другое)
. - любой символ, кроме перевода строки. - это я по ошибки назвал пробелом
А про ошибку чтения регулярки - я поправился. Просто думал, что (?=) выполняется последовательно. Теперь стал знать больше))
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB