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

Posted

技术标签:

【中文标题】42是有效的信用卡号码吗? jQuery 验证器认为它是【英文标题】:Is 42 a valid credit card number? jQuery validator thinks it is 【发布时间】:2010-12-24 06:24:29 【问题描述】:

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

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

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

编辑:撇开搭便车的幽默不谈——我将如何修补验证插件以检查长度。这么简单吗?

【问题讨论】:

它是生命宇宙和万物的答案。为什么它不是有效的信用卡号? @Elijah:因为问题不是“什么是有效的信用卡号?” 我的意思是,答案是 42 的问题。 程序员有没有做过其他文学参考? jQuery 意外的厉害? 【参考方案1】:

我已经更正了 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。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

一个更好的验证器应该检查最少的位数。

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

    // 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,而无需注意最小长度。

【讨论】:

哇,多么糟糕的验证程序。【参考方案4】:

信用卡号的长度可能因发卡机构而异(虽然可以,但通常最短长度约为 13 位数字)。但是,由于这是客户端验证,因此重点可能更多的是减少出现小错字的机会,而不是检查任意数据。这可能应该在服务器端完成。

【讨论】:

但问题是,如果您已经输错了一次 - 当您开始输入以纠正它时,它会告诉您 当您输入时它是正确的,并且然后错了,然后再更正。所有信用卡必须至少有 15 个字符是正确的 - 那么为什么不进行检查。我有我想的来源,但这只是让我厌倦了整体使用这个库。 长度一般在13到19位之间。 最大 19 位数字是 ISO 7812 的限制。理论上,卡号可能只有 6 位数字(对于 IIN),但实际上 13 位数字卡是最短的通常由金融行业发行(现已不再使用)。

以上是关于42是有效的信用卡号码吗? jQuery 验证器认为它是的主要内容,如果未能解决你的问题,请参考以下文章

ruby 练习:阶级战,验证信用卡号码如果信用卡号码我们应该能够验证它是否有效基于

Symfony 1.4 的信用卡验证器

使用 Jquery 进行信用卡验证

信用卡号验证 用c++如何解决?

仅在输入掩码 jquery 中从某个号码开始验证电话号码

jquery表单验证插件validation