Является ли 42 действительным номером кредитной карты? Валидатор jQuery считает, что это

Все мы знаем, что 42 — это ответ на все вопросы, но для меня новость, что это действующий номер кредитной карты.

Попробуйте ввести «42» или «42176» ​​на этой странице проверки jQuery Validation и нажмите OK.

В чем дело? Я думал, что это должна быть библиотека проверки де-факто. Даже Microsoft использует его сейчас, но считает, что «42» и «42176» ​​являются действительными номерами кредитных карт?! Он даже не проверяет длину. Конечно, я не несу ответственности за добавление проверки длины? Это называется валидатором кредитной карты, а не валидатором luhn.

Редактировать: юмор автостопщика в сторону - как мне исправить плагин проверки, чтобы проверить длину. это легко?


person Simon_Weaver    schedule 08.12.2009    source источник
comment
Это ответ на жизнь, вселенную и все такое. Почему это не действительный номер кредитной карты?   -  person Eli Grey    schedule 08.12.2009
comment
@Elijah: Потому что вопрос не в том, какой действительный номер кредитной карты?   -  person R. Martinho Fernandes    schedule 08.12.2009
comment
Я имею в виду вопрос, ответ на который равен 42.   -  person R. Martinho Fernandes    schedule 08.12.2009
comment
Делают ли когда-нибудь программисты какие-либо другие литературные отсылки?   -  person Paul    schedule 08.12.2009
comment
@paul есть 42 известных записанных сообщения об этом, но я слышал только о 42 из них   -  person Simon_Weaver    schedule 08.12.2009
comment
Непреднамеренная крутость со стороны jQuery?   -  person Brett Allen    schedule 08.12.2009
comment
@Paul: ну, есть еще 0x2B | !0x2B.   -  person Joachim Sauer    schedule 11.03.2011


Ответы (4)


Вероятно, это связано с тем, что этот валидатор просто проверяет, соответствует ли предоставленное число LUHN-10<. /a> алгоритм (который удовлетворяет 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 удовлетворяется, без какого-либо внимания к минимальной длине.

person mjv    schedule 08.12.2009
comment
Вау, какая дрянная процедура проверки. - person Ed S.; 08.12.2009

Вы можете комбинировать правило кредитной карты с правилами минимальной и максимальной длины для достижения желаемого. Это может показаться слишком большим усилием — и я могу согласиться — хотя это дает вам больше контроля, если вы хотите принимать только определенные длины номеров карт.

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

Длина номеров кредитных карт может варьироваться в зависимости от эмитента (хотя да, обычно минимальная длина составляет ~ 13 цифр). Однако, поскольку это проверка на стороне клиента, основное внимание, вероятно, уделяется уменьшению вероятности небольшой опечатки, а не проверке произвольных данных. Вероятно, это должно быть сделано на стороне сервера.

person Amber    schedule 08.12.2009
comment
но проблема в том, что если вы уже ошиблись один раз - когда вы начнете печатать, чтобы исправить это, он сообщит вам по мере того, как вы печатаете, что это правильно, а затем неправильно, а затем снова исправьте. все кредитные карты должны быть не менее 15 символов правильно - так почему бы не сделать проверку. у меня есть источник, я полагаю, но это просто утомляет меня от использования этой библиотеки в целом. - person Simon_Weaver; 08.12.2009
comment
Длина должна быть между 13 и 19 цифрами, как правило. - person dave4420; 08.12.2009
comment
Максимум 19 цифр является ограничением ISO 7812. Теоретически номер карты может состоять всего из 6 цифр (для ИИН), хотя на практике 13-значные карты являются самыми короткими, которые обычно выпускались финансовой индустрией (и они больше не используются). - person bobince; 08.12.2009

Я исправил функцию проверки 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 соответственно.

person Sparky    schedule 11.03.2011