密码强度函数只返回一个值

时间:2013-02-17 16:52:02

标签: javascript html passwords

我是Javascript的新手,我正在尝试编写密码强度函数。 但每次输入密码时,它只返回一个值(“非常强”)。 我完全糊涂了!! 这是我的代码:

function pwd_Validation()
    {
        var strength = new Array();
        strength[0] = "Blank";
        strength[1] = "Very Weak";
        strength[2] = "Weak";
        strength[3] = "Medium";
        strength[4] = "Strong";
        strength[5] = "Very Strong";


        var password = document.getElementById('pwd')

        if (password.length < 1)
            var score = 1;


       else if (password.length < 4)
             score = 2


        else if (password.length >= 8 && password.value.match(/[a-z]/))
                 score = 3;


       else if (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/))
                score = 4;


       else  (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/))
                score = 5;


        document.getElementById('spnPwd').innerHTML = strength[score];

        if ( password.value = "")
            document.getElementById('spnPwd').innerHTML = strength[0];
            document.getElementById('spnPwd').style.color="#FF0000"

        if ( strength[score] == 1)
            document.getElementById('spnPwd').innerHTML = strength[1];
            document.getElementById('spnPwd').style.color="#FF0000"

        if ( strength[score] == 3)
            document.getElementById('spnPwd').innerHTML = strength[3];
            document.getElementById('spnPwd').style.color="#FFCC00"

        if ( strength[score] == 4)
            document.getElementById('spnPwd').innerHTML = strength[4];
            document.getElementById('spnPwd').style.color="#19D119"

         if ( strength[score] == 5)
            document.getElementById('spnPwd').innerHTML = strength[5];
            document.getElementById('spnPwd').style.color="#006600"

    }

HTML code:

Password :   <input type="password" id="pwd" onblur="pwd_Validation()" />
                <span id="spnPwd" class="pwd_Strength" ></span><br />

5 个答案:

答案 0 :(得分:2)

上一个if缺少else,因此解析如下:

...
else {
    (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/))
}

score = 5;

总是在控制结构中使用括号是一个好习惯。

答案 1 :(得分:2)

有几个编码错误和逻辑错误。我建议这个重写,以进行以下修复/改进:

  1. 获取实际密码值并使用其长度,而不是使用密码DOM元素的长度。
  2. 处理4到7之间长度的情况(逻辑跳过的情况)
  3. 按正确的顺序对正则表达式测试进行排序,以便它实际找到正确的分数
  4. 更正了标点符号正则表达式
  5. 修复其他逻辑问题
  6. 将颜色放入平行阵列。
  7. 以更有效/更紧凑的方式声明强度字符串。
  8. 为您的分数指定一个默认值,以确保其具有值。
  9. 不要多次重复正则表达式测试
  10. 使用regex.test,因为当你只想知道它是否匹配时,它比regex.match更有效
  11. 从数组中提取所需的颜色值,而不是每个分数的if语句
  12. 仅获取spnPwd DOM元素
  13. 将数字正则表达式更改为\d
  14. 在所有if / else语句中使用大括号以确保安全
  15. 建议的代码:

    function pwd_Validation() {
        var strengths = ["Blank", "Very Weak", "Weak", "Medium", "Strong", "Very Strong"];
        var colors = ["#FF0000", "#FF0000", "#FFCC00", "#FFCC00", "#19D119", "#006600"];
        var score = 0;
        var regLower = /[a-z]/, regUpper = /[A-Z]/, regNumber = /\d/, regPunctuation = /[.,!@#$%^&*?_~\-£()]/;
    
        var password = document.getElementById('pwd').value;
        if (!password) {
            score = 0;
        } else if (password.length < 2) {
            score = 1;
        } else if (password.length < 4) {
            score = 2;
        } else if (password.length <= 7) {
            score = 3;
        } else {
            // length is >= 8 in here
            if (regLower.test(password) && regUpper.test(password) && regNumber.test(password)) {
                // if it also has punctuation, then it gets a 5, otherwise just a 4
                if (regPunctuation.test(password)) {
                    score = 5;
                } else {
                    score = 4;
                }
            } else {
                // if doesn't have upper, lower and numbers, then it gets a 3
                score = 3;
            }
        }
        var spanPwd = document.getElementById('spnPwd');
        spanPwd.innerHTML = strengths[score];
        spanPwd.style.color = colors[score];
    }
    

答案 2 :(得分:0)

您忘记将密码字段转换为其值:

var password = document.getElementById('pwd')

应该是     var password = document.getElementById('pwd')。value

在原始情况下,password.length未定义,与其进行的所有比较均为false。 (所以最后else被执行)

此外,您上一次else阻止

   else  (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/))
            score = 5;

应该是

   else  if(password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/))
            score = 5;

除此之外,请在ifs中使用大括号。拥有这样的代码是不好的做法:

if(...)
 ...
else if(...)
 ...
else
 ...

这样更好:

if(...){
 ...
}else if(...){
 ...
}else{
 ...
}

答案 3 :(得分:0)

我已将代码推送到jsbeautifier.org。这会根据javascript解释器实际运行它的方式重新创建代码。请注意您的if语句如何运行您认为的代码。

function pwd_Validation() {
    var strength = new Array();
    strength[0] = "Blank";
    strength[1] = "Very Weak";
    strength[2] = "Weak";
    strength[3] = "Medium";
    strength[4] = "Strong";
    strength[5] = "Very Strong";

    var password = document.getElementById('pwd')

    if (password.length < 1) var score = 1;
    else if (password.length < 4) score = 2
    else if (password.length >= 8 && password.value.match(/[a-z]/)) score = 3;
    else if (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/)) score = 4;
    else(password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/))
    score = 5;

    document.getElementById('spnPwd').innerHTML = strength[score];

    if (password.value = "") document.getElementById('spnPwd').innerHTML = strength[0];
    document.getElementById('spnPwd').style.color = "#FF0000"

    if (strength[score] == 1) document.getElementById('spnPwd').innerHTML = strength[1];
    document.getElementById('spnPwd').style.color = "#FF0000"

    if (strength[score] == 3) document.getElementById('spnPwd').innerHTML = strength[3];
    document.getElementById('spnPwd').style.color = "#FFCC00"

    if (strength[score] == 4) document.getElementById('spnPwd').innerHTML = strength[4];
    document.getElementById('spnPwd').style.color = "#19D119"

    if (strength[score] == 5) document.getElementById('spnPwd').innerHTML = strength[5];
    document.getElementById('spnPwd').style.color = "#006600"    
}

举一些具体的例子:

if (strength[score] == 5) document.getElementById('spnPwd').innerHTML = strength[5];
document.getElementById('spnPwd').style.color = "#006600"    

可能你打算这样做:

if (strength[score] == 5) {
    document.getElementById('spnPwd').innerHTML = strength[5];
    document.getElementById('spnPwd').style.color = "#006600"
}

此外:

else(password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/))
score = 5;

你可能意味着:

else if (password.length >= 8 && password.value.match(/[a-z]/) && password.value.match(/[A-Z]/) && password.value.match(/[0-9]/) && password.value.match(/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/)) {
    score = 5;
}

您在代码中提到的实际问题是因为我提取的第二个条件。行score = 5 是任何条件的一部分,并且将始终运行(出于上述原因)。这就是为什么你总是看到密码是“非常强大”的原因。

答案 4 :(得分:0)

您保存为var 得分,然后提出强度[得分] if (strength[score] == 3)

然后你在代码的第二部分中遗漏了一些{}!

在最后一部分你可以使用

switch(score) {
 case 1: ... break;

...
 default: ... break;
}