Я предложил бы, чтобы Вы пошли наоборот путем записи незаметного JavaScript.
Делают функции из Вашей работы проекта для пользователей с JavaScript отключенными, и когда Вы сделаны, реализуете свои улучшения UI JavaScript.
Вам, вероятно, лучше проанализировать распределение n-грамм, аналогично обнаружению языка.
Этот код является примером обнаружения языка с использованием триграмм. Я предполагаю, что триграммы, разбивающие клавиатуру, довольно уникальны и не отображаются на обычном языке.
Я бы не стал этого делать - на мой взгляд, эти вопросы ослабляют безопасность, поэтому, как пользователь, я всегда стараюсь предоставить другой полупароль в качестве ответа - для вас это было бы пюре. Ну это пюре, но это именно то, что я хочу делать.
Btw. Я не уверен, что вы можете запросить ответы. Поскольку они преодолевают вашу защиту паролем, с ними следует обращаться как с паролями = храниться в виде хэша!
Изменить:
Когда я прочитал эту статью , я сразу вспомнил эти вопросы;
Я всегда обнаруживал , что люди ставят ответы на вопросы безопасности слабее, чем пароли, которые они используют .
Вопросы безопасности - это всего лишь еще одно звено в цепи безопасности, более слабое звено!
ИМО, лучше было бы разрешить пользователю запрашивать новый пароль, отправленный на его зарегистрированный идентификатор электронной почты . У этого есть два преимущества.
Если у вас ДОЛЖНЫ быть секретные вопросы, позвольте им инициировать повторно сгенерированный (никогда не отправлять пароль пользователя, повторно создавать временный, предпочтительно одноразовый принудительный) отправка пароля на адрес электронной почты, с которым они зарегистрировались - и не показывать это вообще.
Другой трюк - сделать секретный вопрос САМ их зарегистрированный идентификатор электронной почты .
Если они все исправят, вы отправите повторно сгенерированный временный пароль на этот идентификатор электронной почты.
Это невозможно сделать с помощью регулярного выражения. На самом деле, я вообще не могу придумать разумного способа сделать это - где бы вы провели грань между подозрительным и не вызывающим подозрений? Я, на этот раз, часто отвечаю на секретные вопросы запутанными ответами. В конце концов, девичью фамилию моей матери не самое сложное узнать.
Если вы можете найти список букв - Вероятность пар в английском языке, вы можете построить приблизительную вероятность того, что слово не является «настоящим» английским словом, используя наименее возможные пары и пары, которых нет в списке. К сожалению, если у вас есть имена или другие «не-слова», вы не можете заставить их быть английскими словами.
Возможно, вы могли бы проверить обилие согласных. Так, например, в вашем примере lakdsjflkaj
есть 2 гласных (а) и 9 согласных. Обычно вероятность попадания в гласную при случайном нажатии клавиш намного ниже, чем при попадании в согласную.
Вы можете проверить наличие заглавной буквы в начале .... это наверняка даст вам несколько ложных срабатываний.
Быстрый гугл дал мне это , вы можете сравнить каждое с именем в этом списке.
Очевидно, работает только для указанного вами секретного вопроса.
Вы также видели это:
Я хорошенько подумаю в следующий раз, когда буду внедрять защиту вопрос.
Если ваш вопрос когда-либо связан с настоящим человеческим именем, это невозможно. Рассмотрим азиатские имена, набранные латинскими буквами; они вполне могут сработать с любым фильтром, который вы придумаете, но по-прежнему являются вполне законными.
Почему бы вместо регулярных выражений просто не сравнить со списком известных хороших значений? Например, сравните девичью фамилию матери с данными переписи или имя домашнего животного с любым из списков имен домашних животных, которые вы можете найти в Интернете. Для более простой версии просто выполните поиск в Google по введенному тексту. Законные имена должны давать много результатов, в то время как затирание клавиатуры должно давать очень мало результатов, если они вообще есть.
Как и в случае с любым другим методом, вам все равно придется обрабатывать ложные срабатывания.
Вы можете искать шаблоны, которые не имеют фонетического смысла. Например:
'q' без буквы 'u'.
asdf
qwer
zxcv
asdlasd
В принципе, попробуйте затирать на своей клавиатуре, посмотрите, что вы получите, и вставьте это в свой фильтр. Также вставьте различные грамматические правила. Однако, поскольку вы имеете дело с именами, вы всегда получите «того парня» со странным именем, который вызовет ложное срабатывание.