2011-11-21 24 views
18

Genelde aptalca olanlara karşı bir parolayı karşılaştıran bir işlev oluşturmak istiyorum, böylece kullanıcı bunlardan birini seçemez, ancak şu ana kadar yazdığım işlev, komut dosyası arasına koyduğumda etiketler, tanımlanamayan javascript'e neden olur (Firebug tarafından). Dizi oluşturmanın hatalı olduğunu farz ediyorum.Normal İfadeler Dizisi Oluşturma 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

Dizi oluşturmak için [], regex'i eşleştirmek için pwd.match (ptrn), döngü için eksik(), döngüsünüzde ptrn dizi dizini olur, değer değil ve muhtemelen düzenli olarak değiştirmelisiniz döngü için veya bir hasOwnProperty denetimi ekleyin – shesek

+0

Ve işlev çağrıldığında her yeniden yeniden oluşturmak yerine işlevinizin dışında regex dizisi oluşturun. Ayrıca, g bayrağı burada oldukça işe yaramıyor. – shesek

+0

@shesek Döngüyü düzelttim ama maçın bir yöntem olmadığını söylüyor – Chris

cevap

31

Her kelimeyi test döngü gerekmez.

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); 
} 

demo buraya Çalışma: http://jsfiddle.net/jfriend00/cyVbC/

dip not Böyle bunu yapabilir Bütün kelimeleri bir diziye koymanız gerekmez. Tüm regex'i önceden tahmin edebilirsin, ama bunları daha kolay okunabilir kodlar için yapılan gibi dizine koymanın daha kolay olduğunu düşündüm.

Ayrıca bu olabilir:

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

Okunabilirliğe katılıyorum, bu yüzden onları bir dizide tuttum. Bir eşleşme yöntemi olmayan pwd ile ilgili bir sorun yaşadım, ancak üzerinde 'toString()' yi çağırmak onu düzeltti. Yardım için teşekkürler! – Chris

+0

Burada daha uygun olan .match() 'ile' .test() arasında geçiş yapın. – jfriend00

0

Sondaki bir virgülünüz var. Javascript'te takip eden bir virgül kullanamazsınız. Aynı anda hepsini herhangi biri için düzenli ifade motoru görünüm (| karakteri ile ayrılmış) bir düzenli ifade içine hepsini koymak ve izin gibi

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

Düzeltme: ES3'te sondaki virgül kullanamazsınız. ES5'ten beri izin verilir. – shesek

+0

Benim hatam - bu, işlev çağrıları için değil, dizi/nesne değişmezleri için (muhtemelen kullanması gereken) için geçerlidir. – shesek

9

Bir dönüş değeri doğrudur en kısa sürede diziden yineleme duracak olan Array.some kullanarak istiyorum:

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

Bulunan bu şey arıyor başka ve hiç kimsenin bahsetmediği gibi, söze gerek duyuyor. Kara listeleri güçlü parolalar sağlamak için bir araç olarak kullanmamalısınız. Bu bir bakım deliği ve sadece listede olmayan daha kötü şifrelere yol açar. Bunun yerine güçlü şifre politikaları uygulayın.

P4ssw0rd! pek çok psuedo güçlü politika geçirirdi ama çatlamak için saniye sürer.

Tek etkili kara liste, şifre çözme teknikleri tarafından kullanılan tüm kelime listelerini ve birleşik komut dosyalarını dahil etmektir. Bu, kullanıcıların parolalarının yeterince iyi olup olmadığını doğrulamak için dakika/saat/gün beklemeleri anlamına gelir.

Bunun belirli bir soruyu yanıtlamadığını biliyorum, ancak şifre doğrulama işleminin neyin geçerli ve etkili olmadığı konusunda tavsiyede bulunmaya çalışıyor.

İlgili konular