2011-11-21 50 views
18

Tôi muốn tạo một hàm so sánh mật khẩu với một số mật khẩu thường dùng, để người dùng không thể chọn một trong số này, nhưng hàm tôi đã viết cho đến thời điểm này, khi đặt giữa tập lệnh thẻ, không làm cho javascript được nhận diện (bởi Firebug). Tôi cho rằng việc tạo mảng có lỗi.Tạo mảng biểu thức chính quy Javascript

function unacceptable(pwd){ 
    var unforgivable = [ 
    /password/gi, /*g matches any occurance of sequence, i checks case insensitive*/ 
    /12345678/g, 
    /8675309/g, 
    /[a-z]{8,}/gi, 
    /qwerty/gi, 
    /asdfg/gi, 
    /qazwsx/gi, 
    /zxcvb/gi, 
    /letmein/gi, 
    /trustno1/gi, 
    /omnicloud/gi, 
    /monkey/gi]; 
    for (var i=0; i<unforgivable.length; i++) 
     if(pwd.match(unforgivable[i])) return true; 
    return false; 
} 
+0

Sử dụng [] để tạo mảng, pwd.match (ptrn) để đối sánh regex, vòng lặp for của bạn bị thiếu(), ptrn trong vòng lặp của bạn sẽ là chỉ mục mảng, không phải giá trị và bạn có thể chuyển sang thường xuyên cho vòng lặp hoặc thêm một kiểm tra hasOwnProperty – shesek

+0

Và tạo ra các mảng regexes bên ngoài chức năng của bạn thay vì tái tạo nó mỗi khi hàm được gọi. Ngoài ra, lá cờ g là khá nhiều vô ích ở đây. – shesek

+0

@shesek Tôi đã cố định vòng lặp nhưng nó nói khớp không phải là phương thức – Chris

Trả lời

31

Bạn không cần vòng lặp để kiểm tra từng chữ như bạn có thể đặt tất cả chúng vào một biểu thức chính quy (ngăn cách bởi nhân vật |) và để giao diện cơ regex cho bất kỳ trong số họ tất cả cùng một lúc. Bạn có thể làm điều đó như thế này:

function unacceptable(pwd){ 
    var unforgivable = [ 
     "password", 
     "12345678", 
     "8675309", 
     "[a-z]{8,}", 
     "qwerty", 
     "asdfg", 
     "qazwsx", 
     "zxcvb", 
     "letmein", 
     "trustno1", 
     "omnicloud", 
     "monkey" 
    ]; 
    var re = new RegExp(unforgivable.join("|"), "i"); 
    return re.test(pwd); 
} 

Làm việc giới thiệu ở đây: http://jsfiddle.net/jfriend00/cyVbC/

T.B. Bạn không cần phải đặt tất cả các từ vào một mảng. Bạn có thể chỉ cần chiếm trước toàn bộ regex, nhưng tôi nghĩ rằng đặt chúng trong mảng như thế này được thực hiện cho mã dễ đọc hơn được duy trì dễ dàng hơn.

Nó cũng có thể là thế này:

var unforgivable = /password|12345678|8675309|[a-z]{8,}|qwerty|asdfg|qazwsx|zxcvb|letmein|trustno1|omnicloud|monkey/i; 

function unacceptable(pwd){ 
    return unforgivable.test(pwd); 
} 
+0

Tôi đồng ý với khả năng đọc, đó là lý do tại sao tôi có chúng trong một mảng. Tôi đã có một vấn đề với pwd không có một phương pháp phù hợp, nhưng gọi 'toString()' trên nó cố định mà lên. Cảm ơn đã giúp đỡ! – Chris

+0

Chuyển từ '.match()' sang '.test()' thích hợp hơn ở đây. – jfriend00

0

Bạn có dấu phẩy sau. Bạn không thể sử dụng dấu phẩy sau trong javascript.

var unforgivable = new Array(
    /password/gi, /*g matches any occurance of sequence, i checks case insensitive*/ 
    /12345678/g, 
    /8675309/g, 
    /[a-z]{8,}/gi, 
    /qwerty/gi, 
    /asdfg/gi, 
    /qazwsx/gi, 
    /zxcvb/gi, 
    /letmein/gi, 
    /trustno1/gi, 
    /omnicloud/gi, 
    /monkey/gi 
) 
+3

Hiệu chỉnh: bạn không thể sử dụng dấu phẩy sau trong ES3. Nó được cho phép từ ES5. – shesek

+0

Điều xấu của tôi - đó là sự thật đối với mảng/đối tượng literals (mà ông có lẽ nên sử dụng), không phải cho các cuộc gọi chức năng. – shesek

9

Tôi thích sử dụng Array.some, mà sẽ ngừng lặp qua mảng ngay sau khi một giá trị trả về là đúng:

function unacceptable(pwd){ 
    return [ 
     /password/gi, 
     /12345678/g, 
     /8675309/g, 
     /[a-z]{8,}/gi, 
     /qwerty/gi, 
     /asdfg/gi, 
     /qazwsx/gi, 
     /zxcvb/gi, 
     /letmein/gi, 
     /trustno1/gi, 
     /omnicloud/gi, 
     /monkey/gi 
    ].some(function(regexp){ 
     return regexp.test(pwd); 
    }); 
} 
0

Các mặt hàng này tìm kiếm cái gì khác và như không ai khác đã đề cập đến nó, nó cần đề cập đến. Bạn không nên sử dụng danh sách đen làm phương tiện để đảm bảo mật khẩu mạnh. Đó là một lỗ hổng bảo trì và dẫn đến nhiều mật khẩu không đúng trong danh sách của bạn. Thực thi chính sách mật khẩu mạnh thay thế.

P4ssw0rd! sẽ vượt qua nhiều chính sách mạnh mẽ của psuedo nhưng sẽ mất vài giây để crack.

Danh sách đen hiệu quả duy nhất là sắp xếp tất cả các danh sách từ và tập lệnh kết hợp được sử dụng bởi kỹ thuật giải mã, điều này có nghĩa là người dùng đợi phút/giờ/ngày để xác minh xem mật khẩu của họ có đủ tốt hay không.

Tôi biết điều này không trả lời được câu hỏi cụ thể nhưng nó cố gắng tư vấn về những gì và không hiệu quả xác thực mật khẩu.

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