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

Мы все знаем, что 42 является ответом на все, но это новость для меня, что это действительный номер кредитной карты.

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

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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