2008-10-13 31 views
10

Tôi có một điều khiển xác nhận rằng có những biểu hiện sau:ASP.NET Regular Expression Validator (Password Strength)

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

Đó là một mật khẩu với ít nhất 2 chữ số , 2 ký tự alpha, 1 không phải là chữ và sốtối thiểu 8 ký tự. Rất tiếc, điều này dường như không tuân thủ trình duyệt chéo.

Xác thực này hoạt động hoàn hảo trong Firefox, nhưng không có trong Internet Explorer.

Một sự kết hợp của mỗi kết quả câu trả lời của bạn tại:

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

Phần quan trọng là có sự cho chiều dài đầu tiên ({x,}?.).

Trả lời

14

(?=(.*\W.*){0,}) không phải là 0 ký tự không phải chữ và số. Đó là ít nhất 0 ký tự không phải chữ và số. Nếu bạn muốn mật khẩu không chứa bất kỳ ký tự không phải chữ số nào, bạn có thể thực hiện (?!.*\W) hoặc (?=\w*$).

Một giải pháp đơn giản hơn là bỏ qua \W nhìn về phía trước và sử dụng \w{8,} thay vì .{8,}.

Ngoài ra, \w bao gồm \d. Nếu bạn chỉ muốn alpha, bạn có thể thực hiện [^\W\d] hoặc [A-Za-z].

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

này sẽ xác nhận mật khẩu để chứa ít nhất hai chữ số , hai alpha, dài ít nhất 8 ký tự, và chứa nhân vật chỉ alpha-số (bao gồm cả gạch dưới).

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

Edit: Để sử dụng trong tất cả các trình duyệt có thể bạn cần phải làm một cái gì đó như thế này:

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

Chỉnh sửa2: Cập nhật gần đây trong câu hỏi gần như làm mất hiệu lực toàn bộ câu trả lời của tôi.^^;;

Bạn vẫn có thể sử dụng mã JavaScript cuối cùng, nếu bạn thay thế mẫu bằng những gì bạn đã có ban đầu.

Chỉnh sửa3: OK. Bây giờ tôi hiểu ý bạn là gì.

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

Có vẻ như (?=) thực sự không có chiều rộng bằng 0 trong Internet Explorer.

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

Edit4: More đọc: http://blog.stevenlevithan.com/archives/regex-lookahead-bug

Tôi nghĩ rằng điều này có thể giải quyết vấn đề của bạn:

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

Các (?=.{8,}$) nhu cầu đến đầu tiên.

+0

Yea Tôi thấy rằng ngay trước khi bạn đăng, thử nghiệm và nó hoạt động: D – nyxtom

-3

Làm thế nào về một trong những jQuery sức mạnh dựa trên mật khẩu hiện xác nhận - như: http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html

+0

Không tốt. Sau đó, anh ta cần phải xác thực lại phía máy chủ và duy trì logic hai lần. –

+2

Bạn thực sự nên xác thực ở phía máy chủ bất kể xác thực phía khách hàng nào có thể đã được thực hiện. Không bảo đảm khách hàng đã làm bất cứ điều gì bạn nghĩ rằng nó nên (Trình duyệt có thể đã tắt javascript, khách hàng có thể thậm chí không phải là một trình duyệt.). – marcj

1

Điều này sẽ giúp bạn có 2 chữ số, 2 phút và 8 ký tự. Tôi từ chối cho bạn biết cách không cho phép người dùng có ký tự không phải chữ và số trong mật khẩu của họ, tại sao các trang web muốn thực thi mật khẩu kém an toàn hơn?

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

Haha Tôi đồng ý: P 0 đã có bởi vì nó được đặt phía máy chủ (nó là tối thiểu hơn là 'bạn có thể có 0 không chữ và số') – nyxtom

+0

Làm cách nào để các ký tự không phải chữ số và chữ số làm cho mật khẩu kém an toàn hơn? –

+0

[Reread] ".. Tôi từ chối cho bạn biết cách ** không ** cho phép người dùng có các ký tự không phải chữ và số" – nyxtom

Các vấn đề liên quan