Регулярное выражение для затирания клавиатуры - PullRequest
5 голосов
/ 21 июля 2009

При регистрации новых учетных записей веб-приложения часто запрашивают ответ на «секретный вопрос», то есть имя собаки и т. Д.

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

"Девичья фамилия матери?" lakdsjflkaj

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

Примечание. Я не использую ТОЛЬКО регулярные выражения в этих «ответах на секретные вопросы»

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

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

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

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

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

Спасибо!

Ответы [ 11 ]

39 голосов
/ 21 июля 2009

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

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

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

12 голосов
/ 21 июля 2009

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

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

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

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

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

Еще одна хитрость заключается в том, чтобы сделать секретный вопрос САМОМ их зарегистрированным идентификатором электронной почты .
Если они исправят это, вы отправите сгенерированный временный пароль на этот идентификатор электронной почты.

6 голосов
/ 21 июля 2009

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

5 голосов
/ 21 июля 2009

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

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

4 голосов
/ 21 июля 2009

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

4 голосов
/ 21 июля 2009

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

3 голосов
/ 12 февраля 2017

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

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

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

2 голосов
/ 21 июля 2009

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

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

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

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

Анатомия атаки твиттера

В следующий раз я собираюсь серьезно подумать над вопросом безопасности.

0 голосов
/ 21 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...