42是有效的信用卡号码吗? jQuery验证器认为它是

时间:2009-12-08 02:23:22

标签: jquery jquery-validate credit-card

我们都知道42 is the answer to everything,但对我来说这是一个有效的信用卡号码。

尝试在此jQuery Validation testing page中输入“42”或“42176”,然后点击“确定”。

发生了什么事?我认为这应该是事实上的验证库。即使微软现在正在使用它,但它认为'42'和'42176'是有效的信用卡号码?!它甚至没有进行长度检查。当然,我也不负责增加长度检查?它被称为'信用卡'验证器,而不是'luhn'验证器。

编辑:hitchhiker幽默一边 - 我将如何修补验证插件来检查长度。那很容易吗?

4 个答案:

答案 0 :(得分:12)

这可能是因为这个验证器只是检查提供的数字是否满足LUHN-10算法(42满足,因为4 * 2 + 2 = 10,0模10)。

更好的验证器应该检查最少的数字。

我不确定这是否与jQuery的最新代码相对应,但我发现与信用卡验证相关的代码段:

    // http://docs.jquery.com/Plugins/Validation/Methods/creditcard
    // based on http://en.wikipedia.org/wiki/Luhn
    creditcard: function(value, element) {
        if ( this.optional(element) )
            return "dependency-mismatch";
        // accept only digits and dashes
        if (/[^0-9-]+/.test(value))
            return false;
        var nCheck = 0,
            nDigit = 0,
            bEven = false;

        value = value.replace(/\D/g, "");

        for (n = value.length - 1; n >= 0; n--) {
            var cDigit = value.charAt(n);
            var nDigit = parseInt(cDigit, 10);
            if (bEven) {
                if ((nDigit *= 2) > 9)
                    nDigit -= 9;
            }
            nCheck += nDigit;
            bEven = !bEven;
        }

        return (nCheck % 10) == 0;
    },

...正如你所看到的那样,只检查所有字符是否为数字并且LUHN-10是否满足,而不需要注意小事长度。

答案 1 :(得分:8)

您可以将信用卡规则与最小和最大长度规则结合使用,以达到您的目的。这可能看起来太费劲了 - 我可能会同意 - 尽管如果你只想接受某些卡号,它会给你更多的控制权。

$('form').validate({
    '#ccNum': {
                   creditcard: true,
                   required: true,
                   minlength: 13,
                   maxlength: 19
              }
});

答案 2 :(得分:6)

信用卡号码的长度可能因发行人而异(尽管如此,通常最小长度为~13位)。但是,由于这是客户端验证,因此重点可能更多地放在减少错字的可能性上,而不是检查任意数据。这可能应该在服务器端完成。

答案 3 :(得分:0)

我已经更正了jQuery验证功能,以便在验证时考虑信用卡长度。

我在信用卡验证码中添加了以下内容 -

if (value.length > 19 || value.length<12)
{
    return (false);
}

信用卡验证部分的完整代码如下: -

creditcard: function(value, element) {
if ( this.optional(element) )
return "dependency-mismatch";
// accept only digits and dashes
if (/[^0-9-]+/.test(value))
return false;

// Modified part to check minimum and maximum card length
if (value.length > 19 || value.length<12)
{
    return (false);
}

var nCheck = 0,
nDigit = 0,
bEven = false;
value = value.replace(/\D/g, "");

for (n = value.length - 1; n >= 0; n--) {
var cDigit = value.charAt(n);
var nDigit = parseInt(cDigit, 10);
if (bEven) {
if ((nDigit *= 2) > 9)
nDigit -= 9;
}
nCheck += nDigit;
bEven = !bEven;
}

return (nCheck % 10) == 0;
},

我已经将最小和最大卡长分别硬编码为12和19。