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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
vlom
Отправлено: 15 Февраля, 2013 - 09:22:06
Post Id



Частый посетитель


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


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




Когда устраивался на работу программистом, на одном из собеседований мне дали тестовое задание. Суть такова сделать регистрацию пользователя (структуру бд дали, но это не суть важно), главное это валидация пароля была:
1) Проверка длину
2) Проверка на разрешенные символы в пароле (пропускаем)
3) что-то еще было, уже не помню
и самый главный пункт это
n) проверка на буквы и цифры введенные подряд (повторение ), то есть не пропускать такие пароли в которых содержится 123, или qwe, или 1qa или wsx в общем суть думаю ясна, что бы не было повторов как по горизонтали, так и по вертикали

С этим заданием я не справился, но решение найти все таки охота.

Пришла в голову такая мысль, полученную от пользователя строку (пароль) разбить на массив в котором символы пароля будут значениями элементов, один символ = один элемент. Так же создаем массив-матрицу по подобию клавиатуры, но в этом массиве будут символы ключами получится примерно так
Спойлер (Отобразить)

но на этом у меня какт-то все заглохло, в ступоре я, как теперь сравнивать массив с полученными значениями из пароля??
Может у меня не правильно направление в поиске такого решения
 
 Top
philimon
Отправлено: 15 Февраля, 2013 - 09:43:00
Post Id


Новичок


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


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




У меня верхний ряд состоит из 13 значений, далее 2 радя из 12 и последний из 10. Как здесь считать символы, идущие по порядку сверху-вниз?
 
 Top
Мелкий Супермодератор
Отправлено: 15 Февраля, 2013 - 09:43:15
Post Id



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


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


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




vlom пишет:
проверка на буквы и цифры введенные подряд (повторение )

Таки повторение или расположенные рядом на клавиатуре?


-----
PostgreSQL DBA
 
 Top
DelphinPRO
Отправлено: 15 Февраля, 2013 - 09:51:22
Post Id



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


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


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




philimon пишет:
Как здесь считать символы, идущие по порядку сверху-вниз?

это достаточно очевидно
по диагонали направо
1qaz, 2wsx, 3edc, 4rfv
и налево
4esz, 5rdx, 6tfc


PS интересная задачка. на выходных порешаю. Улыбка


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
vlom
Отправлено: 15 Февраля, 2013 - 09:57:48
Post Id



Частый посетитель


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


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




Мелкий пишет:
Таки повторение или расположенные рядом на клавиатуре?

Рядом на клавиатуре, не четко выразил свою мысль
 
 Top
philimon
Отправлено: 15 Февраля, 2013 - 10:11:10
Post Id


Новичок


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


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




DelphinPRO пишет:
это достаточно очевидно

не достаточно, будет ли считаться повтором 0p
 
 Top
vlom
Отправлено: 15 Февраля, 2013 - 10:13:53
Post Id



Частый посетитель


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


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




philimon пишет:
не достаточно, будет ли считаться повтором 0p

хм, думаю что да.
 
 Top
Stierus Супермодератор
Отправлено: 15 Февраля, 2013 - 10:22:11
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




В строке не должно быть таких последовательностей или строка не должна состоять только из последовательности?

пример

подходит ли строка "eqaz" ?
подходит ли строка "t1234y" ?
 
My status
 Top
OrmaJever Модератор
Отправлено: 15 Февраля, 2013 - 10:22:53
Post Id



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


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


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




vlom помоему везьде где я встречал такую систему "по порядку" считается только четыре ряда клавиатуры (qwertyuiop, asdfghjkl, zxcvbnm), учитывать диагонали и прочее не стоит, т.к это уже не простой пароль.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
vlom
Отправлено: 15 Февраля, 2013 - 10:24:13
Post Id



Частый посетитель


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


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




Stierus пишет:
В строке не должно быть таких последовательностей или строка не должна состоять только из последовательности?

не должно быть последовательностей
asr123d - не корректно
pf2mt7hOr - правильно
 
 Top
EuGen Администратор
Отправлено: 15 Февраля, 2013 - 10:25:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




На самом деле все достаточно просто, если выбрать правильную структуру. Я взял стандартные декартовы координаты с осью ординат, направленной вниз и "нулем в кнопке 1". То есть кнопка 1 получила координаты 0,0. Исходя из этого я определил qwery-раскладку примерно так (обращаю внимание на то, что заглавные буквы или спец. символы тоже нужно вносить в полный вариант массива-раскладки):
PHP:
скопировать код в буфер обмена
  1. // 4x4 part of keyboard with 'qwerty' keymap
  2. $rgKeymap=array(
  3. '1'=>array(0,0),
  4. '2'=>array(1,0),
  5. '3'=>array(2,0),
  6. '4'=>array(3,0),
  7. 'q'=>array(0,1),
  8. 'w'=>array(1,1),
  9. 'e'=>array(2,1),
  10. 'r'=>array(3,1),
  11. 'a'=>array(0,2),
  12. 's'=>array(1,2),
  13. 'd'=>array(2,2),
  14. 'f'=>array(3,2),
  15. 'z'=>array(0,3),
  16. 'x'=>array(1,3),
  17. 'c'=>array(2,3),
  18. 'v'=>array(3,3)
  19. );

- соответственно, задача сводится к определению, есть ли идущие по порядку убывания/возрастания подпоследовательности в соответствующих линиях по X или по Y:
PHP:
скопировать код в буфер обмена
  1. function checkKeymap($sData, $rgKeymap, $iMinSequence=3)
  2. {
  3.    //check X:
  4.    $rgX = array();
  5.    array_walk(str_split($sData), function($sChar) use ($rgKeymap, &$rgX)
  6.    {
  7.       $rgX[$rgKeymap[$sChar][1]][]=$rgKeymap[$sChar][0];
  8.    });
  9.    $iPosCount = 0;
  10.    $iNegCount = 0;
  11.    foreach($rgX as $rgLine)
  12.    {
  13.       for($i=1; $i<count($rgLine); $i++)
  14.       {
  15.          $iPosCount=$rgLine[$i-1]-1==$rgLine[$i]?$iPosCount+1:1;
  16.          $iNegCount=$rgLine[$i-1]+1==$rgLine[$i]?$iNegCount+1:1;
  17.          if($iPosCount>=$iMinSequence || $iNegCount>=$iMinSequence)
  18.          {
  19.             return false;
  20.          }
  21.       }
  22.    }
  23.    //check Y:
  24.    $rgY = array();
  25.    array_walk(str_split($sData), function($sChar) use ($rgKeymap, &$rgY)
  26.    {
  27.       $rgY[$rgKeymap[$sChar][0]][]=$rgKeymap[$sChar][1];
  28.    });
  29.    $iPosCount = 0;
  30.    $iNegCount = 0;
  31.    foreach($rgY as $rgLine)
  32.    {
  33.       for($i=1; $i<count($rgLine); $i++)
  34.       {
  35.          $iPosCount=$rgLine[$i-1]-1==$rgLine[$i]?$iPosCount+1:1;
  36.          $iNegCount=$rgLine[$i-1]+1==$rgLine[$i]?$iNegCount+1:1;
  37.          if($iPosCount>=$iMinSequence || $iNegCount>=$iMinSequence)
  38.          {
  39.             return false;
  40.          }
  41.       }
  42.    }
  43.    return true;
  44. }

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 15 Февраля, 2013 - 10:25:51
Post Id



Частый посетитель


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


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




OrmaJever пишет:
учитывать диагонали и прочее не стоит, т.к это уже не простой пароль.

тут уже дело не в том что стоит учитывать или не стоит, дело в интересности для меня задачи, вот уже год как она из головы у меня не уходит
 
 Top
Stierus Супермодератор
Отправлено: 15 Февраля, 2013 - 10:28:33
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




У вас есть 3 массива - вертикальный и горизонтальный + вертикальный без цифр:

$x = array('1', 'q', 'a', 'z', '2', 'w', 's', 'x', '3', ...);
$y = array('q', 'a', 'z','w', 's', 'x', 'e', ...);
$z = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'q', 'w', 'e', ...);

Далее вы идете побуквенно по строке пароля и для каждого массива храние 2 значения: текущее положение и количество совпадений подряд идущих


НУ а дальше зависит от предыдущего вопроса:
если строка целиком должна состоять из последовательностей - ты должен идти подрят по строке и массиву и при несовпадении всех трех массивов выходить, говоря, что пароль тест прошел.

Если же ты в строке ищешь последовательности - нужно при несовпадениях сбрасывать счетчики в ноль, а возвращать непрохождение теста при условии, что встретилась последовательность критической длинны хотя бы в одном из массивов
(Добавление)
Вариант Евгена более прост
 
My status
 Top
vlom
Отправлено: 15 Февраля, 2013 - 10:34:23
Post Id



Частый посетитель


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


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




Stierus пишет:
Вариант Евгена более прост

но суть программистов такова что
(Добавление)
спасибо всем за советы, а EuGen и Stierus +1 в репу
Прикреплено изображение (Нажмите для увеличения)
02a0587ff1fe63b767c3c235957bb1a2.jpg
 
 Top
Prizma
Отправлено: 15 Февраля, 2013 - 14:08:37
Post Id



Посетитель


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


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




интересненько =)
вот мой вариант, у меня это вышло легко и просто вот таким образом:
1. составить массив строк составляющих все возможные простые последовательности
Например
PHP:
скопировать код в буфер обмена
  1. $a = array('qwerty...','12345...',1qaz','2wsx,'...,'5rdx');

2. определить какое минимальное кол-во символов должно повторяться тоесть:
если пароль udpek67 - проходит,
а udpek678 - не должен проходить тогда в этом случае повторятся не должны 3 символа(это можно взять как один из аргументов функции)
3. запустить полученную от пользователя строку пароля в цикл где мы на каждый шаг цикла будем выбирать по 3 символа от начала к концу пример:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $n = 3; # кол-во повтор. символов
  3. $result = TRUE; # признак результата
  4. for($i=0;isset($str[$i+$n]) AND $result;$i++){
  5.         $newstr = substr($str,$i,$n); # тут мы получаем строку длинной $n c позиции i
  6.         for($j=0;isset($a[$j]) AND $result;$j++){ # тут прогоняем массив строк $a
  7.                 for($s=0;isset($a[$j][$s+$n]) AND $result;$s++){ # здесь прогоняем нашу строку длиной $n по нашему алфавиту $a[$j]
  8.                         $newstr2 = substr($a[$j][$s+$n];$s;$n);
  9.                         if($newstr===$newstr2)$result = FALSE; 
  10.                 }
  11.         }
  12. }
  13. if($result){
  14.         echo 'пароль надёжен';
  15. }else{
  16.         echo 'пароль слишком прост, укажите более сложный пароль';
  17. }
  18. ?>

15 минут заняло =) не проверял правда, наверняка есть какие то опечатки, надеюсь что суть ясна
 
My status
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB