2008-10-13 10 views
10

Mam kontroli poprawności, która ma następujące wyrażenie:ASP.NET Regular Expression walidatora (Password Strength)

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

To hasło z co najmniej 2 cyfr, 2 alfa znaków, 1 niealfanumeryczne i 8 znaków minimum. Niestety nie wygląda na to, że jest zgodna z wieloma przeglądarkami.

Ta funkcja sprawdza się doskonale w przeglądarce Firefox, ale nie działa w przeglądarce Internet Explorer.

Połączenie każdego ze swoich wyników w odpowiedziach:

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,}).*$" 

Ważną kawałek jest posiadanie na długość pierwszy ({x}?.).

Odpowiedz

14

(?=(.*\W.*){0,}) jest nie 0 nie alfanumeryczne znaki. Jest to co najmniej 0 niealfanumerycznych znaków. Jeśli chcesz, aby hasło nie zawierało żadnych niealfanumerycznych znaków, możesz to zrobić: (?!.*\W) lub (?=\w*$).

Prostszym rozwiązaniem byłoby pominięcie wyświetlania \W i użycie \w{8,} zamiast .{8,}.

Również \w zawiera \d. Jeśli chcesz tylko alfa, możesz to zrobić: [^\W\d] lub [A-Za-z].

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

To sprawdzania hasła zawierać co najmniej dwie cyfry , dwie wartości alfa być przynajmniej osiem znaków i zawierają tylko znaki alfanumeryczne (w tym podkreślenie).

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

Edit: W tym celu używać we wszystkich przeglądarkach prawdopodobnie trzeba zrobić coś takiego:

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

Edycja2: Niedawna aktualizacja pytania niemal unieważnia moją całą odpowiedź.^^;;

Nadal powinieneś być w stanie używać kodu JavaScript na końcu, jeśli zamienisz wzór na oryginalny.

Edytuj3: OK. Teraz rozumiem, co masz na myśli.

/^(?=.*[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 

Wydaje (?=) naprawdę nie jest zero-szerokość w programie Internet Explorer.

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

Edit4: Więcej czytanie: http://blog.stevenlevithan.com/archives/regex-lookahead-bug

myślę, że można to rozwiązać swój problem:

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

W (?=.{8,}$) potrzeby na pierwszym miejscu.

+0

Tak, widziałem to tuż przed wysłaniem, przetestowaniem i działaniem: D – nyxtom

-3

Jak o jednym z istniejących jQuery siłę hasła w oparciu Walidatory - jak: http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html

+0

Nic dobrego. Potem będzie musiał ponownie sprawdzić poprawność serwera i zachować logikę dwa razy. –

+2

Naprawdę powinieneś walidować po stronie serwera, niezależnie od tego, co zostało zatwierdzone po stronie klienta. Nie ma gwarancji, że klient zrobił coś, co powinno (przeglądarka może mieć wyłączony javascript, klient może nawet nie być przeglądarką). – marcj

1

Otrzymasz 2 min znaków, 2 min znaków i min. 8 znaków długości ... Nie chcę pokazywać, jak nie zezwalać użytkownikom na używanie w hasłach znaków niealfanumerycznych, dlaczego witryny chcą wymuszać mniej bezpieczne hasła?

^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$ 
+0

Haha Zgadzam się: P 0 było, ponieważ zostało ustawione po stronie serwera (jest to raczej minimalne niż "możesz mieć 0 niealfanumeryczny") – nyxtom

+0

W jaki sposób posiadanie znaków niealfanumerycznych sprawia, że ​​hasło jest mniej bezpieczne? –

+0

[Reread] "... odmawiam pokazywania, jak ** nie ** pozwalać użytkownikom na używanie znaków niealfanumerycznych" – nyxtom

Powiązane problemy