Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Проверка пароля на наличие последовательностей
Форумы портала PHP.SU » PHP » Регулярные выражения » Проверка пароля на наличие последовательностей

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

1. pioneer - 29 Марта, 2015 - 10:57:18 - перейти к сообщению
Доброго времени суток, уважаемые форумчане!

Собственно, столкнулся вот с такой задачей: нужно средствами PHP проверить вводимый пользователем пароль (при регистрации/смене пароля) на наличие последовательностей типа "abc", "12345", "xyz" и т.д. (т.е. обезопасить его от создания "простых паролей", в которых идут по порядку друг за другом символы алфавита или цифры). Постановка задачи вроде бы и простая, а вот как сделать - не знаю.

Буду очень признателен Вам за помощь! Заранее спасибо.
2. andrewkard - 29 Марта, 2015 - 11:13:13 - перейти к сообщению
Создайте такую строку и проверяйте вхождение, если оно есть, выдавайте ошибку, не забудьте так же такие как qwerty Улыбка
3. OrmaJever - 29 Марта, 2015 - 11:16:14 - перейти к сообщению
Только что придумал
PHP:
скопировать код в буфер обмена
  1. function checkPass( $pass )
  2. {
  3.     $len = mb_strlen( $pass );
  4.     $sum = 0;
  5.     for( $i=0; $i < $len-1; ++$i) {
  6.         if( abs(ord($pass[$i]) - ord($pass[$i+1])) == 1 ) {
  7.             ++$sum;
  8.         }
  9.     }
  10.     return $sum > $len / 2;
  11. }
  12.  
  13.  
  14. $p1 = 'asdljkaas';
  15. $p2 = 'abcde123';
  16. $p3 = 'xyz';
  17.  
  18. echo checkPass( $p1 ), '<br>';
  19. echo checkPass( $p2 ), '<br>';
  20. echo checkPass( $p3 ), '<br>';
4. LIME - 29 Марта, 2015 - 11:43:25 - перейти к сообщению
OrmaJever на клавиатуре символы расположены не по кодировке
придется последовательность еще задать
5. DeepVarvar - 29 Марта, 2015 - 11:57:57 - перейти к сообщению
Лайм, какая клавиатура? Аскии по порядку идут. Ну почти )) А вот для утф-6/7/8/16/32 может не взлететь, да.
6. LIME - 29 Марта, 2015 - 11:59:32 - перейти к сообщению
А последовательности на клаве не по порядку
qwerty
можно и забить конечно
(Добавление)
и еще непонятно зачем mb_strlen если $pass[$i]
7. DeepVarvar - 29 Марта, 2015 - 12:28:39 - перейти к сообщению
LIME пишет:
qwerty

Никто не вправе меня ограничивать в выборе пароля.
Еще какое-то тело меня будет принуждать придумывать пароли, которые я в таком случае завтра же забуду.
Это мое личное дело, может я хочу пароль ака пустая строка.
Да, тут я ССЗБ, но это мой выбор.
8. LIME - 29 Марта, 2015 - 12:32:58 - перейти к сообщению

DeepVarvar а че ты это мне говоришь?
скажи это ТС ))

(Добавление)

начитаются хабра а потом кидаются на людей
9. DeepVarvar - 29 Марта, 2015 - 12:41:14 - перейти к сообщению
Это я то швабры начитался? Неее, это еще в 2006-м писалось. Загугли - "Каганов - За что я не навижу линукс"
10. pioneer - 29 Марта, 2015 - 12:48:59 - перейти к сообщению
в общем насколько я понял самый оптимальный (и универсальный) вариант - придумать такую строку и проверять вхождение?

так будет правильно?
PHP:
скопировать код в буфер обмена
  1.  
  2. $universalString = "ABCDEF...abcdef...012345..."; // многоточие = продолжение символов алфавита / цифр
  3. $passFromForm = $_POST['pass'];
  4. $pos = strpos($universalString, $passFromForm);
  5.  
  6. if ($pos === false) {
  7.     // строка $passFromForm не найдена в строке $universalString
  8. } else {
  9.     // недопустимый пароль! строка $passFromForm найдена в строке $universalString
  10. }
  11.  
  12.  
11. Ts.Saltan - 29 Марта, 2015 - 13:37:41 - перейти к сообщению
Эмм, а если пароль qwerty123 или 123qwerty? тут универсальную строку сделать не получится.

Наверное, лучше сделать массив с элементами, использование которых запрещено в пароле,
PHP:
скопировать код в буфер обмена
  1. <?
  2. function isValid($pass){
  3.         $badPhrases = [
  4.                 '123',
  5.                 'qwerty',
  6.                 'abc',
  7.                 'xyz',
  8.                 '000',
  9.                 'hello',
  10.                 'password',
  11.                 '111'
  12.         ];
  13.  
  14.         //Костыль для проверки, ибо не знаю какие еще функции умеют с массивами работать
  15.         return strlen($pass) == strlen(str_replace($badPhrases,NULL,$pass));
  16. }
  17.  
  18. var_dump(isValid('qwerty123')); //bool(false)
  19. var_dump(isValid('123qwerty')); //bool(false)
  20. var_dump(isValid('helloworld')); //bool(false)
  21. var_dump(isValid('strongPassWord')); //bool(true)

(Добавление)
Нет, плохое решение, например, "123$tr0ngP@SS" это относительно тяжелый пароль, но он не пройдёт. Лучше использовать какой-нибудь коэффициент.
(Добавление)
Как-то так
PHP:
скопировать код в буфер обмена
  1. <?
  2. function isValid($pass){
  3.         $k = 0.5; //Как минимум половина пароля не должна совпадать с "плохими" фразами
  4.         $badPhrases = [
  5.                 '123',
  6.                 'qwerty',
  7.                 'abc',
  8.                 'xyz',
  9.                 '000',
  10.                 'hello',
  11.                 'password',
  12.                 '111'
  13.         ];
  14.         return (strlen(str_replace($badPhrases,NULL,$pass))/strlen($pass)) > $k;
  15. }
  16.  
  17. var_dump(isValid('qwerty123')); //bool(false)
  18. var_dump(isValid('123qwerty')); //bool(false)
  19. var_dump(isValid('helloworld')); //bool(false)
  20. var_dump(isValid('strongPassWord')); //bool(true)
  21. var_dump(isValid('123$tr0ngP@SS')); //bool(true)
12. LIME - 29 Марта, 2015 - 13:53:23 - перейти к сообщению
перебор всех вариантов?
мндя)
если взять минимальную длину возможной последовательности то можно также гулять посимвольно по паролю и смотреть вхождение в строку последовательности
типа
PHP:
скопировать код в буфер обмена
  1. strpos($universalString, substr($pass, $i, $i + $minLen))

(Добавление)
а если проверять на часто употребляемые слова, то лучше взять готовые словари и засунуть в бд
быстро и емко)
(Добавление)
словари для брутфорса
не словарь Ожигова))
(Добавление)
DeepVarvar пишет:
Неее, это еще в 2006-м писалось
сути дела не меняет)
меняй прямо в shadow во имя свободы
13. MiksIr - 29 Марта, 2015 - 17:53:00 - перейти к сообщению
Есть pecl
http://php.net/manual/en/crack.installation.php
14. LIME - 29 Марта, 2015 - 18:22:07 - перейти к сообщению
фигня
бд всяко быстрее
cracklib использует словари по слову в новой строке
а бд всеже индексирует слова
15. MiksIr - 29 Марта, 2015 - 18:29:55 - перейти к сообщению
cracklib несколько умнее чем тупая сверка по словарю

а "всяко быстрее" тут вообще ни о чем

 

Powered by ExBB FM 1.0 RC1