2009-12-08 9 views
11

Todos sabemos que 42 is the answer to everything, pero es nuevo para mí que es un número de tarjeta de crédito válido.¿Es 42 un número de tarjeta de crédito válido? El validador de jQuery piensa que es

Intente ingresar '42' o '42176' en este jQuery Validation testing page y haga clic en Aceptar.

¿Qué está pasando? Pensé que se suponía que esta era la biblioteca de validación de facto. Incluso Microsoft lo está usando ahora, pero cree que '42' y '42176' son números de tarjetas de crédito válidos. Ni siquiera está haciendo un control de longitud. Seguramente no soy responsable de agregar un cheque de longitud también? Se llama validador de "tarjeta de crédito" y no validador "luhn".

Editar: humor de autoestop a un lado - ¿cómo voy a parchear el complemento de validación para verificar la longitud. es así de fácil?

+5

Es la respuesta a la vida del universo y de todo. ¿Por qué no sería un número de tarjeta de crédito válido? –

+1

@Elijah: Porque la pregunta no es "¿Qué es un número de tarjeta de crédito válido?" –

+2

Quiero decir, la pregunta cuya respuesta es 42. –

Respuesta

12

Esto es probablemente porque este validador simplemente verifica que el número suministrado satisfaga el algoritmo LUHN-10 (que 42 satisface desde 4 * 2 + 2 = 10 que es 0 módulo 10).

Un mejor validador debería verificar un número mínimo de dígitos.

no estoy seguro de que esto se corresponde con el último código de jQuery, pero me pareció que el fragmento asociado a la validación de tarjetas de crédito:

// 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; 
    }, 

... y como ves esto simplemente comprobar que todos los caracteres son dígitos y que LUHN-10 está satisfecho, sin prestar atención a la longitud de un minial.

+6

Guau, que rutina de validación es horrible. –

+0

@ed desafortunadamente sí: -/ –

6

La longitud de los números de tarjetas de crédito puede variar según el emisor (aunque sí, generalmente hay una longitud mínima de ~ 13 dígitos). Sin embargo, dado que esta es la validación del lado del cliente, el enfoque probablemente sea más en la reducción de la posibilidad de un pequeño error tipográfico, y menos en la verificación de datos arbitrarios. Eso probablemente debería hacerse en el lado del servidor.

+0

pero el problema es si ya lo ha hecho mal una vez: cuando comience a escribir para corregirlo, le dirá * mientras escribe * que es correcto y luego incorrecto, y luego corre nuevamente. todas las tarjetas de crédito deben tener al menos 15 caracteres correctos, entonces ¿por qué no está haciendo un cheque? Supongo que tengo la fuente, pero me cansa de usar esta biblioteca en general. –

+0

La longitud debe tener entre 13 y 19 dígitos, en general. – dave4420

+1

El máximo de 19 dígitos es una limitación de ISO 7812. Teóricamente, un número de tarjeta puede ser de solo 6 dígitos (para el IIN), aunque en la práctica las tarjetas de 13 dígitos son las más cortas emitidas comúnmente por la industria financiera (y ya no están en uso). – bobince

8

Puede combinar la regla de la tarjeta de crédito con las reglas de longitud mínima y máxima para lograr lo que desea. Esto puede parecer demasiado esfuerzo, y podría estar de acuerdo, aunque le da más control si solo quiere aceptar ciertos largos de números de tarjetas.

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

gracias! y POR SUPUESTO solo quiero aceptar números CC de ciertas longitudes !!! –

0

he corregido la función de jQuery validar tener en cuenta la longitud de tarjeta de crédito en la validación.

que añade lo siguiente a la validación de tarjetas de crédito código-

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

El código completo de la parte de validación de la tarjeta de crédito es el siguiente: -

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; 
}, 

me han codificado los valores mínimo y máximo longitudes de tarjeta como 12 y 19 respectivamente.

Cuestiones relacionadas