Регулярное выражение для затирания клавиатуры

StackOverflow https://stackoverflow.com/questions/1159690

  •  18-09-2019
  •  | 
  •  

Вопрос

При регистрации новых учетных записей веб-приложения часто запрашивают ответ на "секретный вопрос", т.е.Кличка собаки и т.д.

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

"Девичья фамилия матери?" лакдшфлкай

Есть какие-нибудь предложения относительно того, как мне следует это сделать?

Примечание:Я использую регулярные выражения не только в этих "ответах на секретные вопросы"

"Ответы" могут быть:

  1. Выбирается из базы данных с использованием нескольких базовых регулярных выражений sql

  2. Анализируется столько раз, сколько необходимо, с использованием регулярных выражений python

  3. Сравнивал / сокращал / оценивал по мере необходимости

Это технический вопрос, а не философский ;-)

Спасибо!

Это было полезно?

Решение

Вероятно, вам лучше проанализировать распределение по n-граммам, аналогично определению языка.

Этот код это пример определения языка с помощью триграмм.Я предполагаю, что триграммы, разбивающие клавиатуру, довольно уникальны и не отображаются на обычном языке.

Другие советы

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

Кстати.Я не уверен в том факте, что вы можете запросить ответы.Поскольку они преодолевают вашу защиту паролем, с ними следует обращаться как с паролями = хранить в виде хэша!

Редактировать:
Когда я читаю эта статья Я сразу вспомнил эти вопросы ;-)

Весь подход к вопросам безопасности весьма порочен.

Я всегда находил люди используют секретные ответы слабее, чем пароли, которые они используют.
Контрольные вопросы - это всего лишь еще одно звено в цепочке безопасности - более слабое звено!

ИМО, лучшим способом было бы пойти на разрешить пользователю запрашивать новый пароль, отправленный на его зарегистрированный идентификатор электронной почты.Это имеет два преимущества.

  1. попытка перебора должна сначала обнаружить и взломать службу электронной почты (и вы никогда не поможете им в этом - держите регистрационный идентификатор электронной почты очень защищенным)
    • пользователь вашего сервиса всегда получит уведомление, когда кто-то попытается применить грубую силу (он получит электронное письмо, в котором говорится, что он пытался восстановить свой пароль).

Если у вас ДОЛЖНЫ быть секретные вопросы, позвольте им инициировать повторную отправку пароля (никогда не отправляйте пароль пользователя, повторно создайте временный, предпочтительно одноразовый принудительный) на адрес электронной почты, на который они зарегистрировались, и вообще не показывайте это.

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

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

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

Может быть, вы могли бы проверить обилие согласных.Так, например, в вашем примере lakdsjflkaj есть 2 гласные (a ) и 9 согласных.Обычно вероятность попадания на гласную при случайном нажатии клавиш намного ниже, чем вероятность попадания на согласную.

Деджанк это библиотека Ruby, из которой вы можете черпать вдохновение.В нем реализованы некоторые предложения из других ответов.Он считает ввод затиранием с клавиатуры, если ввод:

  • Содержит биграммы символов, которые вряд ли появятся в реальном тексте, но которые расположены близко друг к другу на клавиатуре.(Библиотека включает в себя список таких биграмм.)
  • Начинается с неожиданного знака препинания.
  • В нем слишком много очень коротких слов.
  • Не имеет гласных.
  • Содержит символы, которые повторяются необоснованное количество раз.

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

Быстрый поиск в Google выдал мне это, вы могли бы сравнить каждое из них с именем в этом списке.

Очевидно, что это работает только для контрольного вопроса, который вы указали.

Вы тоже видели это:

Анатомия атаки в Twitter

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

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

Вы могли бы искать шаблоны, которые не имеют смысла фонетически.Такие , как:

"q", за которым не следует "u".

асдф

qwer ( квэр )

zxcv

асдласд

В принципе, попробуйте сделать затирание на вашей собственной клавиатуре, посмотрите, что у вас получится, и подключите это к вашему фильтру.Также подключайте различные грамматические правила.Однако, поскольку вы имеете дело с именами, вы всегда будете получать "того парня" со странным именем, который вызовет ложноположительный результат.

Вместо регулярных выражений, почему бы просто не сравнить со списком известных хороших значений?Например, сравните девичью фамилию матери с данными переписи населения или кличку домашнего животного с любым из списков имен домашних животных, которые вы можете найти в Интернете.Для гораздо более простой версии этого, просто выполните поиск в Google по всему, что введено.Допустимые имена должны давать множество результатов, в то время как затирание с клавиатуры должно приводить к очень небольшому количеству результатов, если таковые вообще имеются.

Как и в случае с любым другим методом, вам все равно нужно будет обрабатывать ложные срабатывания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top