ASP.NET Regular Expression Validator (Надежность пароля) - PullRequest
10 голосов
/ 14 октября 2008

У меня есть элемент проверки, который имеет следующее выражение:

(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,}

Это пароль, содержащий не менее 2 цифры , 2 буквенных символа , 1 не алфавитно-цифровых и 8 символов минимум . К сожалению, это не совместимо с браузерами.

Эта проверка отлично работает в Firefox, но не в Internet Explorer.

Сочетание каждого из ваших ответов приводит к:

var format = "^(?=.{" + minLength + ",})" + 
    (minAlpha > 0 ? "(?=(.*[A-Za-z].*){" + minAlpha + ",})" : "") + 
    (minNum > 0 ? "(?=(.*[0-9].*){" + minNum + ",})" : "") + 
    (minNonAlpha > 0 ? "(?=(.*\\W.*){" + minNonAlpha + ",})" : "") + ".*$";

EX: "^(?=.{x,})(?=(.*[A-Za-z].*){y,})(?=(.*[0-9].*){z,})(?=(.*\W.*){a,}).*$"

Важным элементом является наличие (?. {X,}) для длины first .

Ответы [ 3 ]

14 голосов
/ 14 октября 2008

(?=(.*\W.*){0,}) - это не 0 не алфавитно-цифровых символов. Это не менее 0 не буквенно-цифровых символов. Если вы хотите, чтобы пароль не содержал никаких буквенно-цифровых символов, вы можете ввести (?!.*\W) или (?=\w*$).

Более простым решением было бы пропустить прогноз \W и использовать \w{8,} вместо .{8,}.

Также \w включает \d. Если вам нужна только альфа, вы можете сделать либо [^\W\d], либо [A-Za-z].

/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/

В этом случае пароль будет содержать не менее двух цифр , двух альф , не менее 8 символов и только альфа -числовые символы (включая подчеркивание).

  • \w = [A-Za-z0-9_]
  • \d = [0-9]
  • \s = [ \t\n\r\f\v]

Edit: Чтобы использовать это во всех браузерах, вам, вероятно, нужно сделать что-то подобное:

var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }

Edit2: Недавнее обновление вопроса почти лишает законной силы весь мой ответ. ^^;;

В конце концов вы все равно сможете использовать код JavaScript, если вы замените шаблон тем, что имели изначально.

Редактировать3: ОК. Теперь я понимаю, что вы имеете в виду.

/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{3,}/.test("password123") // matches
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{4,}/.test("password123") // does not match
/^(?=.*[a-z].*[a-z]).{4,}/.test("password123")                   // matches

Кажется, (?= ) не совсем нулевая ширина в Internet Explorer.

http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html

Edit4: More reading: http://blog.stevenlevithan.com/archives/regex-lookahead-bug

Я думаю, что это может решить вашу проблему:

/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")

(?=.{8,}$) должен стоять первым.

1 голос
/ 14 октября 2008

Это даст вам 2 мин цифры, 2 мин символов и мин 8 символов длины ... Я отказываюсь показать вам, как не разрешать пользователям вводить в паролях не алфавитно-цифровые символы, почему сайты хотят применять меньше безопасные пароли?

^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$
0 голосов
/ 14 октября 2008

Как насчет одного из существующих валидаторов надежности паролей на основе jQuery, например: http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html

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