RegEx для проверки пароля (ASP) - PullRequest
2 голосов
/ 20 октября 2011

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

  • Пароль должен содержать не менее 12 символов
  • Пароль не должен начинаться с цифры
    • Пароль должен иметь 3 из следующих 4 характеристик:
    • Хотя бы одна строчная буква (AZ)
    • Как минимум одна строчная буква (az)
    • Как минимум одна цифра (0-9)
    • Как минимумодин из следующих символов: дефис (-), подчеркивание (_), доллар ($), фунт / хэш (#)

Я использую vbscript и классический ASP,

Заранее спасибо, m0dest0

Ответы [ 3 ]

7 голосов
/ 20 октября 2011

Хотя это немного громоздко, это может быть выполнено в одном регулярном выражении, например так:

Dim myRegExp
Set myRegExp = New RegExp
myRegExp.Pattern = "^(?=.{12})(?![0-9])(?:(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))[A-Za-z0-9-_$#]+$"
If myRegExp.Test(SubjectString) Then
    ' Successful match
Else
    ' Match attempt failed
End If

Вот прокомментированная версия регулярного выражения: (в синтаксисе режима свободного пробега PHP - который может быть прочитан простыми смертными):

$re_password = '/
    # Match password having multiple, specific requirements.
    ^                       # Anchor to start of string.
    (?=.{12})               # Password must be at least 12 characters long.
    (?![0-9])               # Password must not begin with a number.
    (?:                     # Password must have 3 out of 4 characteristics:
       # Either... Case 1: (All but R1).
      (?=[^a-z]*[a-z])      # R2: At least one lower case letter (a-z).
      (?=[^0-9]*[0-9])      # R3: At least one number (0-9).
      (?=[^-_$\#]*[-_$\#])  # R4: At least one of: [-_$#].
    |  # Or... Case 2: (All but R2).
      (?=[^A-Z]*[A-Z])      # R1: At least one upper case letter (A-Z).
      (?=[^0-9]*[0-9])      # R3: At least one number (0-9).
      (?=[^-_$\#]*[-_$\#])  # R4: At least one of: [-_$#].
    |  # Or... Case 3: (All but R3).
      (?=[^A-Z]*[A-Z])      # R1: At least one upper case letter (A-Z).
      (?=[^a-z]*[a-z])      # R2: At least one lower case letter (a-z).
      (?=[^-_$\#]*[-_$\#])  # R4: At least one of: [-_$#].
    |  # Or... Case 4: (All but R4).
      (?=[^A-Z]*[A-Z])      # R1: At least one upper case letter (A-Z).
      (?=[^a-z]*[a-z])      # R2: At least one lower case letter (a-z).
      (?=[^0-9]*[0-9])      # R3: At least one number (0-9).
    )                       # End group of 3-out-of-4 alternatives.
    [A-Za-z0-9-_$\#]+       # Match the password string.
    $                       # Anchor to end of string.
    /x';

Предполагается, что пароль не может содержать символы, отличные от [A-Z], [a-z], [0-9] и [-_$#]. Также предполагается, что пароль может содержать символы всех 4 типов.

: «3 из 4 требований» решается здесь грубой силой (путем явного указания всех возможных комбинаций падежей в качестве группы альтернатив - и повторения общих выражений для каждого случая). Это работает здесь, потому что есть только 4 возможных случая для тестирования, но этот метод становится очень громоздким, если есть дополнительные требования (например, "должно соответствовать 5 из 20 требований ..." ). Как уже говорили другие, есть определенные преимущества для разделения на несколько частей, например, Вы можете получить пользовательское сообщение об ошибке с каждым режимом сбоя.

Но это может быть выполнено с помощью одного регулярного выражения!

Редактировать 2011-10-20: Повышена эффективность 4 условных выражений требований путем замены ленивых звездочек на более точные жадные выражения.

3 голосов
/ 20 октября 2011

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

Я бы сделал это с несколькими выражениями, потому что они будут работать быстрее, смотритечище, быть более понятным, и результаты могут быть использованы для предоставления обратной связи относительно того, ПОЧЕМУ пароль не совпадает (если вы хотите быть таким хорошим)

Эти выражения будут проверяться, как указано:

.{12,}            # Password must be at least 12 characters long
^(?!\d)           # Password must not begin with a number
(.*[A-Z].*)+      # At least one upper case letter (A-Z)
(.*[a-z].*)+      # At least one lower case letter (a-z)
(.*[0-9].*)+      # At least one number (0-9)
(.*[-_$#].*)+     # At least one of the following symbols: hyphen ( - ), underscore ( _ ), dollar ( $ ), pound/hash ( # )

Оцените каждый из них как логическое значение, а затем предоставьте обратную связь, если достаточное их количество не удовлетворено

При этом, это очень ограничительная политика паролей - только отсутствие числа начинается со значительногоЛегче угадать.

Я думаю, это МОЖЕТ быть помещено в одно регулярное выражение, но не знаю - я мог бы обойти это

2 голосов
/ 20 октября 2011

Когда все, что у вас есть, это молоток, а?

Серьезно, хотя использование регулярных выражений здесь не совсем правильный ответ.Если вы не можете использовать регулярные выражения, то, по крайней мере, разбейте его на несколько случаев и оцените каждый в отдельности.

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

...