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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проверка пароля на наличие последовательностей

 PHP.SU

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


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

> Без описания
pioneer
Отправлено: 29 Марта, 2015 - 10:57:18
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Февр. 2013  


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




Доброго времени суток, уважаемые форумчане!

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

Буду очень признателен Вам за помощь! Заранее спасибо.
 
 Top
andrewkard
Отправлено: 29 Марта, 2015 - 11:13:13
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


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




Создайте такую строку и проверяйте вхождение, если оно есть, выдавайте ошибку, не забудьте так же такие как qwerty Улыбка
 
 Top
OrmaJever
Отправлено: 29 Марта, 2015 - 11:16:14
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Только что придумал
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>';


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
LIME
Отправлено: 29 Марта, 2015 - 11:43:25
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




OrmaJever на клавиатуре символы расположены не по кодировке
придется последовательность еще задать
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Марта, 2015 - 11:57:57
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Лайм, какая клавиатура? Аскии по порядку идут. Ну почти )) А вот для утф-6/7/8/16/32 может не взлететь, да.
 
 Top
LIME
Отправлено: 29 Марта, 2015 - 11:59:32
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




А последовательности на клаве не по порядку
qwerty
можно и забить конечно
(Добавление)
и еще непонятно зачем mb_strlen если $pass[$i]
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Марта, 2015 - 12:28:39
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




LIME пишет:
qwerty

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


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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





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

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

начитаются хабра а потом кидаются на людей
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Марта, 2015 - 12:41:14
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Это я то швабры начитался? Неее, это еще в 2006-м писалось. Загугли - "Каганов - За что я не навижу линукс"
 
 Top
pioneer
Отправлено: 29 Марта, 2015 - 12:48:59
Post Id


Новичок


Покинул форум
Сообщений всего: 27
Дата рег-ции: Февр. 2013  


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




в общем насколько я понял самый оптимальный (и универсальный) вариант - придумать такую строку и проверять вхождение?

так будет правильно?
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.  
 
 Top
Ts.Saltan
Отправлено: 29 Марта, 2015 - 13:37:41
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


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




Эмм, а если пароль 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)
 
 Top
LIME
Отправлено: 29 Марта, 2015 - 13:53:23
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




перебор всех вариантов?
мндя)
если взять минимальную длину возможной последовательности то можно также гулять посимвольно по паролю и смотреть вхождение в строку последовательности
типа
PHP:
скопировать код в буфер обмена
  1. strpos($universalString, substr($pass, $i, $i + $minLen))

(Добавление)
а если проверять на часто употребляемые слова, то лучше взять готовые словари и засунуть в бд
быстро и емко)
(Добавление)
словари для брутфорса
не словарь Ожигова))
(Добавление)
DeepVarvar пишет:
Неее, это еще в 2006-м писалось
сути дела не меняет)
меняй прямо в shadow во имя свободы
 
 Top
MiksIr
Отправлено: 29 Марта, 2015 - 17:53:00
Post Id


Забанен


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


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

[+]




-----
self-banned
 
 Top
LIME
Отправлено: 29 Марта, 2015 - 18:22:07
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




фигня
бд всяко быстрее
cracklib использует словари по слову в новой строке
а бд всеже индексирует слова
 
 Top
MiksIr
Отправлено: 29 Марта, 2015 - 18:29:55
Post Id


Забанен


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


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

[+]


cracklib несколько умнее чем тупая сверка по словарю

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


-----
self-banned
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB