2010-03-29 106 views
12

¿Existen expresiones regulares conocidas para validar los datos de la pista 1 y 2 de la tarjeta de crédito?Expresión regular para datos de seguimiento de tarjeta de crédito

EDIT:

De Wikipedia:

La información sobre la pista 1 en tarjetas financieras está contenido en varios formatos: Una, que está reservado para uso propio del emisor de la tarjeta, B, que se describe a continuación , CM, que están reservados para su uso por ANSI Subcomité X3B10 y NZ, que están disponibles para su uso por los emisores de tarjetas individuales:

pista 1, Formato B:

  • inicio centinela - un carácter (por lo general '%')
  • código de formato = "B" - un carácter (Alpha)
  • número de cuenta principal (PAN) - hasta 19 caracteres. Por lo general, pero no siempre, coincide con el número de tarjeta de crédito impreso en el frente de la tarjeta.
  • Separador de campo - un carácter (por lo general '^')
  • Nombre - dos a 26 caracteres
  • Separador de campo - un carácter (por lo general '^')
  • Fecha de caducidad - cuatro caracteres en forma AAMM.
  • Código de servicio - tres caracteres
  • datos discrecional - puede incluir PIN de verificación de indicadores clave (PVKI, 1 carácter), PIN Verification Value (PVV, 4 caracteres), Card Verification Value o código de verificación de la tarjeta (CVV o CVK, 3 caracteres)
  • centinela final - un carácter (generalmente '?')
  • verificación de redundancia longitudinal (LRC) - es un carácter y un carácter de validez calculado a partir de otros datos en la pista. Cabe señalar que la mayoría de los dispositivos lectores no devuelven este valor cuando la tarjeta se pasa a la capa de presentación, y la usan solo para verificar la entrada internamente en el lector.

Pista 2: Este formato fue desarrollado por la industria bancaria (ABA). Esta pista está escrita con un esquema de 5 bits (4 bits de datos + 1 paridad), que permite dieciséis caracteres posibles, que son los números 0-9, más los seis caracteres:; < =>? . La selección de seis símbolos de puntuación puede parecer extraña, pero de hecho los dieciséis códigos simplemente se asignan al rango ASCII de 0x30 a 0x3f, que define diez dígitos más los seis símbolos. El formato de datos es el siguiente:

  • inicio centinela - un carácter (por lo general ';')
  • número de cuenta principal (PAN) - hasta 19 caracteres. Por lo general, pero no siempre, coincide con el número de tarjeta de crédito impreso en el frente de la tarjeta.
  • Separador: un carácter (generalmente '=')
  • Fecha de caducidad: cuatro caracteres con el formato YYMM. código
  • Servicio - tres caracteres
  • datos discrecionales - como en la pista uno
  • Fin centinela - un carácter (por lo general '?')
  • Comprobación de redundancia longitudinal (LRC): es un carácter y un carácter de validez calculado a partir de otros datos en la pista. Cabe señalar que la mayoría de los dispositivos lectores no devuelven este valor cuando la tarjeta se pasa a la capa de presentación, y la usan solo para verificar la entrada internamente en el lector.
+0

¿Puede proporcionarnos algunos ejemplos de dichos datos? –

+0

He estado en el negocio de cc por un tiempo y ahora me cuesta imaginar por qué necesitarías esto. En general, dado que la pista 1,2,3 está en el dominio del emisor, a menudo será difícil encontrar datos que no sean PAN, fecha de vencimiento y código de servicio en los datos de la pista y el nombre que podrían ser basura, incluso he venido a través de PAN que no pasan el control de Luhn.Esta es la razón por la cual me parece que tendrás un buen número de casos especiales en producción para ajustar la expresión regular para que sea lo suficientemente sensible como para no descartar datos de producción que entren en conflicto con la especificación ISO. – bbozo

Respuesta

2

estaba a punto de publicar el mismo enlace en regular-expressions.info, para verificar el número de parte cc de la pista.

Ahora, viene la parte difícil. Los datos de seguimiento varían en el formato entre los emisores de tarjetas e incluso los lectores de tarjetas. Por ejemplo, los caracteres 'separadores' no son siempre lo mismo. Lo mismo se aplica al final 'centinelas'.

Wikipedia ofrece una buena panorámica: http://en.wikipedia.org/wiki/Magnetic_stripe_card

Con pista2, se sigue el número de la tarjeta por un '=' (o de vez en cuando una 'D'). Luego tiene fecha de caducidad como MMDD. Después de eso, Track2 tiene 'datos discrecionales', que podrían ser cualquier cosa.

No me preocuparía demasiado después de este punto. Si se trata de datos de seguimiento, ya estarás bastante seguro. Supongo que depende de lo que pretendas hacer con los datos.

De todos modos, para Track2 usted podría hacer mucho peor que la adición de [= D] [0-9] {4} en lugar de los $ al final de la expresión regular cc:

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})[=D][0-9]{4} 

Para pista1, podría hacer algo similar ... Track1 contiene más datos variables, por lo que puede ser un poco más complicado.

¡Buena suerte!

1

Pista 1, Formato B se traduce en

^%B[^\^\W]{0,19}\^[^\^]{2,26}\^\d{4}\w{3}[^?]+\?\w?$ 

con algunas suposiciones sobre lo que constituye un carácter válido.

Por supuesto, no hay comprobaciones sobre si los datos son realmente significativos, y el LRC (si está presente) tampoco se puede validar.

¿Puedes verificar esto con algunos datos reales y ver si funciona?

Track 2 se traduce en

;[^=]{0,19}=\d{4}\w{3}[^?]+\?\w? 
+0

Probé estos con los datos de nuestro lector de tarjetas, pero no funcionaron. – NYSystemsAnalyst

+0

Parece que el campo "datos discrecionales" permite todas las alternativas, y no solo una de ellas. He cambiado las expresiones regulares. Ahora deberían funcionar. –

2

Las siguientes dos expresiones regulares parecen validar los datos de la pista 1 y la pista 2. Tenga en cuenta que estas expresiones regulares hacen suposiciones de que los caracteres utilizados son los que se utilizan "en general" en la información de Wikipedia anterior.

Track 1: ^%B\d{0,19}\^[\w\s\/]{2,26}\^\d{7}\w*\?$ 

Supone que% y? son los caracteres centinela y que^se usa como el carácter separador de campo. También asume que el número de cuenta, la fecha y el código de servicio son dígitos.

Track 2: ;\d{0,19}=\d{7}\w*\? 

Supone que; y? son los personajes centinelas y ese = es el carácter separador de campo. También asume que el número de cuenta, la fecha y el código de servicio son dígitos.

Probé estas expresiones usando la lectura de datos de seguimiento de un lector de tarjetas MagTek.Los siguientes dos conjuntos de datos coinciden pista de lo que fue leído por el lector y validar contra las dos expresiones regulares anteriores (los números, obviamente, han sido cambiados):

%B1234567891234567^SMITH/JOHN    ^15024041234567891234? 
;1234567891234567=152024041234567891234? 
8

Aquí es una expresión regular que funcione para mí para recoger tanto la pista 1 y Pista 2. Use esto con la opción de expresión regular "El punto NO coincide con la línea nueva".

^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?|;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z 

Probé con estos datos (mi lector está leyendo tanto un registro de las pistas 1 y 2, en este orden, por la misma tarjeta Probé con -. Los números y el nombre cambiado más adelante)

%B5581123456781323^SMITH/JOHN^16071021473810559010203? 
;5581123456781323=160710212423468? 

gRUPOS dE CAPTURA la expresión regular anterior utiliza con nombre ("?", el que comienza cada uno (grupo)) y ver el resultado (con RegexBuddy) como:

Match 1: %B5581123456781323^SMITH/JOHN^16071021473810559010203?  0  54 
Group "FC": B  1  1 
Group "PAN": 5581123456781323   2  16 
Group "NM": SMITH/JOHN  19  10 
Group "ED": 1607  30  4 
Group "SC": 102  34  3 
Group "DD": 1473810559010203  37  16 

Match 2: ;5581123456781323=160710212423468?  56  34 
Group "FC" did not participate in the match 
Group "PAN": 5581123456781323  57  16 
Group "NM" did not participate in the match 
Group "ED": 1607  74  4 
Group "SC": 102  78  3 
Group "DD": 12423468  81  8 

Nota el segundo partido no identifica FC (formato código) d NM (nombre) en la Pista 2 (partido 2) ya que no se utilizan en la pista 2.

Si su motor de expresiones regulares no admite GRUPOS NOMBRADOS, simplemente elimine el "?" parte de cada uno de los grupos de captura. Luego, usa la posición para determinar cada grupo.

Además, mi SWIPE único contiene TANTO la pista 1 como la pista 2 (en ese orden, la pista 1, una crlf y luego la pista 2). Según el enlace de Wikipedia en la pregunta original, las tarjetas pueden tener hasta 3 pistas y los lectores pueden leer las pistas 1 y 2 (o una u otra) y raramente realizar un seguimiento 3.

Por esta razón, creo que es un apuesta segura para usar un REGEX que busque tanto la pista 1 como la pista 2 y si obtienes ambas, puedes ignorar la pista 2 (ya que la pista 1 tiene más datos) o lo que desees.

Como las dos pistas están presentes en mis golpes, el motor REGEX devolverá 2 coincidencias con mi REGEX anterior (suponiendo que no haya ningún error de lectura en el lector y un lector que admita ambas pistas). En mi caso, esto no me molesta y simplemente planearé usar el "primer partido" e ignorar el segundo.

Si usted está interesado sólo en la pista 1, utilice esta expresión regular:

^%(?<FC>.)(?<PAN>[\d]{1,19}+)\^(?<NM>.{2,26})\^(?<ED>[\d]{0,4}|\^)(?<SC>[\d]{0,3}|\^)(?<DD>.*)\?\Z 

Si usted está interesado sólo en la pista 2, utilice la expresión regular:

^;(?<PAN>[\d]{1,19}+)=(?<ED>[\d]{0,4}|=)(?<SC>[\d]{0,3}|=)(?<DD>.*)\?\Z 

Pero no veo daño al verificar ambos y luego usar el primero que obtienes, o tal vez comparar la pista 1 con la pista 2 como un paso adicional de comprobación de errores.

¡Siento responder lo que parece ser respondido!

+0

Las otras respuestas no funcionan en las tarjetas de regalo, ¡gracias! – Dustin

+0

Sin embargo, su track2 no funciona en tarjetas de regalo. – Dustin

+0

Al analizar más el tema, parece que algunas tarjetas de regalo tienen 0 caracteres para el nombre, a pesar de que Wikipedia dice que tiene entre 2 y 26 caracteres. – Dustin

0

Nota: El número de cuenta en la pista 1 puede contener espacios para tarjetas American Express. Entonces:

^%(?.)(?[\d\s]{1,19}+)\^(?.{2,26})\^(?[\d]{0,4}|\^)(?[\d]{0,3}|\^)(?.*)\?|;(?[\d]{1,19}+)=(?[\d]{0,4}|=)(?[\d]{0,3}|=)(?.*)\?\Z
Cuestiones relacionadas