ASP.net PasswordStrengthRegularExpression для предотвращения общих паролей, таких как «11111» или «123456» - PullRequest
1 голос
/ 08 июня 2010

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

Знаете ли вы регулярное выражение для использования во встроенной опции PasswordStrengthRegularExpression?

Редактировать : Я знаю, что это довольно расплывчато, и это то, что я сказал клиенту. Определение что-то вроде

  • Не допускайте использования одного и того же символа более 3 раз подряд (1111, 2222 и т. Д.)
  • Не разрешать восходящие или нисходящие тренды (12345, abcde, 6543 и т. Д.)

Ответы [ 5 ]

2 голосов
/ 08 июня 2010

Это слишком много требует от регулярных выражений. Вы можете достаточно легко охватить повторяющиеся символы:

^(?:(.)(?!\1\1)){6,}$

Но единственный способ запретить серию последовательных символов - это перечислить все возможности:

^(?:(?!123|234|345|456|567|678|789).)*$

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

^(?=(?:[^0-9]*[0-9]){2})
 (?=(?:[^A-Z]*[A-Z]){2})
 (?=(?:[^a-z]*[a-z]){2})
 (?:([A-Za-z0-9])(?!\1\1)){6,}$

Это заставит пользователей быть немного креативнее.

1 голос
/ 08 июня 2010

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

static bool IsPasswordRelativelyStrong(string input)
{
    for (int i = 2; i < input.Length; i++)
    {
        if (input[i] == input[i - 1] - 1 && input[i - 1] == input[i - 2] - 1)
            return false;
        else if (input[i] == input[i - 1] + 1 && input[i - 1] == input[i - 2] + 1)
            return false;
        else if (input[i] == input[i - 1] && input[i - 1] == input[i - 2])
            return false;
    }

    return true;
}

Итак, учитывая следующий массив

string[] passwords = { "123456", "abcde", "654321", "111223", "11223344" };

Проходит только последний. Эту функцию можно расширить, чтобы определить, разрешаете ли вы и / или запрашиваете не алфавитно-цифровые символы, и должен ли пароль превышать минимальную длину.

1 голос
/ 08 июня 2010

Как насчет этого?

passwordStrengthRegularExpression=" @\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"

Проверяет, что пароль соответствует следующим критериям:

  • Больше семи символов.
  • Содержит хотя бы одинцифра.
  • Содержит хотя бы один специальный (не буквенно-цифровой) символ.

http://msdn.microsoft.com/en-us/library/system.web.security.membership.passwordstrengthregularexpression.aspx

0 голосов
/ 08 июня 2010

Вы можете утверждать минимальный уровень сложности;например, «как минимум одна заглавная буква, одна строчная буква, одна цифра, минимальная длина 6 символов, только буквенно-цифровые символы» могут быть записаны как

 ^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{6,}$
0 голосов
/ 08 июня 2010

попробуйте это:

passwordStrengthRegularExpression="^\S*([a-zA-Z0-9]{1,10})$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...