Số thẻ thử nghiệm Visa và Mastercard thường là hai dòng đầu tiên trong bất kỳ bộ dữ liệu thử nào, và cũng thường là hai dòng duy nhất. Đó là một sai lầm tốn kém. Các mạng thẻ không chỉ khác nhau ở logo in trên tấm nhựa: chúng khác về dải tiền tố, về độ dài số thẻ, về vị trí của mã bảo mật và cả về cách giao diện nên hiển thị chúng. Nếu bộ dữ liệu thử của bạn chỉ có hai mạng phổ biến nhất, những lỗi nghiêm trọng nhất sẽ nằm ngoài tầm kiểm thử.
Vì sao các mạng thẻ hành xử khác nhau?
Mỗi mạng thẻ là một hệ thống độc lập với quy hoạch đánh số riêng. Khi một mạng mở rộng quy mô, họ cần thêm dải số mới, và điều đó khiến danh sách tiền tố của các mạng ngày càng dài và chồng lấn nhau ở vài chỗ. Một số mạng còn dùng độ dài số thẻ khác với mười sáu chữ số mà phần lớn mọi người quen thuộc.
Hệ quả thực tế là rất nhiều đoạn mã xử lý số thẻ được viết dựa trên giả định sai. Chúng giả định mọi số thẻ đều dài mười sáu chữ số, giả định mã bảo mật luôn gồm ba chữ số ở mặt sau, hoặc giả định chữ số đầu tiên đủ để xác định mạng thẻ. Mỗi giả định như vậy là một lỗi đang chờ được kích hoạt bởi một khách hàng thật.
Mỗi mạng thẻ khác nhau ở những điểm nào?
Bảng dưới đây tóm tắt những khác biệt cần đưa vào bộ dữ liệu thử. Các dải số được mô tả theo khoảng, đúng như tài liệu công khai của ngành.
| Mạng thẻ | Dải tiền tố tiêu biểu | Độ dài thường gặp | Mã bảo mật |
|---|---|---|---|
| Visa | Bắt đầu bằng bốn | Mười ba, mười sáu hoặc mười chín | Ba chữ số ở mặt sau |
| Mastercard | Năm mốt đến năm mươi lăm, và dải hai hai hai mốt đến hai bảy hai không | Mười sáu | Ba chữ số ở mặt sau |
| American Express | Ba mươi tư và ba mươi bảy | Mười lăm | Bốn chữ số ở mặt trước |
| Discover | Sáu không một một, sáu lăm, sáu bốn bốn đến sáu bốn chín, và dải sáu hai hai một hai sáu đến sáu hai hai chín hai lăm | Mười sáu | Ba chữ số ở mặt sau |
| JCB | Ba năm hai tám đến ba năm tám chín | Mười sáu | Ba chữ số ở mặt sau |
| Diners Club | Ba trăm đến ba trăm lẻ năm, ba mươi sáu, ba mươi tám đến ba mươi chín | Mười bốn đến mười chín | Ba chữ số ở mặt sau |
| UnionPay | Sáu hai | Mười sáu đến mười chín | Ba chữ số ở mặt sau |
| Maestro | Năm mươi và năm mươi sáu đến sáu mươi chín | Mười hai đến mười chín | Ba chữ số ở mặt sau |
Hai dòng đáng chú ý nhất là American Express và Diners Club. American Express dùng độ dài mười lăm chữ số và mã bảo mật bốn chữ số ở mặt trước, hai đặc điểm mà giao diện thanh toán rất hay làm sai. Diners Club trải trên nhiều độ dài khác nhau, nên nó là lựa chọn tốt để thử những đoạn mã vẫn còn tin rằng mọi số thẻ đều dài mười sáu chữ số.
Chọn dải số nào để đưa vào bộ dữ liệu thử?
Đừng cố phủ mọi dải số có thể có. Hãy chọn dựa trên những giả định mà mã nguồn của bạn đang ngầm mang theo, vì đó chính là những chỗ dễ vỡ nhất.
- Nếu phần kiểm tra độ dài của bạn chỉ nhận mười sáu chữ số, hãy đưa vào một thẻ mười lăm chữ số và một thẻ mười chín chữ số.
- Nếu giao diện của bạn luôn yêu cầu mã bảo mật ba chữ số, hãy đưa vào một thẻ yêu cầu bốn chữ số ở mặt trước.
- Nếu bạn nhận diện mạng thẻ chỉ bằng chữ số đầu tiên, hãy đưa vào hai mạng thẻ cùng chia sẻ chữ số đầu đó.
- Nếu bạn dùng một dải tiền tố dài, hãy đưa vào hai dải chồng lấn nhau để kiểm tra thứ tự ưu tiên khi so khớp.
Một bộ dữ liệu thử tốt không cần nhiều, nhưng mỗi bản ghi nên tồn tại vì một lý do rõ ràng và có thể giải thích cho người đọc mã sau này.
Làm sao biết một dải số là của mạng nào?
Trong đoạn mã của bạn, hãy ưu tiên so khớp theo tiền tố dài nhất trước rồi mới rút ngắn dần, thay vì so khớp tuần tự từ trên xuống. Cách này tránh được tình huống một dải tiền tố ngắn vô tình che mất một dải tiền tố dài hơn nằm trong tập dữ liệu.
Ngoài ra, bạn nên chấp nhận rằng không phải dải số nào cũng nằm trong danh sách bạn biết. Các mạng thẻ bổ sung dải mới theo thời gian, và một hệ thống chỉ chấp nhận những dải đã biết sẽ chặn nhầm khách hàng dùng thẻ mới phát hành. Cách xử lý an toàn là dùng danh sách dải số để hiển thị logo và để tinh chỉnh giao diện, chứ không dùng nó làm hàng rào từ chối duy nhất.
Dùng công cụ khi bạn cần dữ liệu nhiều mạng
Việc tìm ra một dãy số hợp lệ cho từng mạng thẻ và tự tính chữ số kiểm tra là công việc lặp lại nhàm chán. Trong trình tạo số thẻ tín dụng giả của trang này, bạn có thể chọn cố định một mạng thẻ cụ thể để sinh số, hoặc để chế độ ngẫu nhiên và nhận về một tập hợp trải trên nhiều mạng. Bạn cũng có thể dán một phần số thẻ đã biết kèm tiền tố để công cụ điền nốt phần còn lại, hữu ích khi bạn cần tái hiện đúng một tình huống đã gặp.
Mọi số thẻ do công cụ tạo ra đều đúng cấu trúc và hợp lệ theo phép kiểm tra chữ số, nhưng chưa từng được phát hành và không thể hoàn tất bất kỳ giao dịch thanh toán nào. Chúng chỉ dùng cho kiểm thử phần mềm và trình diễn biểu mẫu.
Nếu bạn muốn hiểu vì sao mỗi dãy số lại cần một chữ số kiểm tra riêng, hãy đọc bài về thuật toán Luhn. Còn nếu bạn đang chuẩn bị một bộ dữ liệu thử cho nhiều kịch bản cùng lúc, bài số thẻ tín dụng thử nghiệm sẽ giúp bạn phân biệt các nguồn dữ liệu khác nhau.
Phần dành cho nhà phát triển
Cách tiếp cận hiệu quả nhất là biến bộ dữ liệu thử thành một ma trận có hai chiều: mạng thẻ ở một chiều, và các đặc điểm cần thử ở chiều còn lại. Thay vì liệt kê thủ công hàng chục trường hợp, bạn suy ra chúng từ hai danh sách.
Vài điểm thực tế:
- Mỗi dòng trong bộ dữ liệu nên có tên mô tả kịch bản. Một số thẻ không nói lên điều gì; một cái tên như thẻ dài mười chín chữ số của mạng thẻ có mã bốn chữ số ở mặt trước thì nói lên tất cả.
- Giữ bộ dữ liệu trong một nơi duy nhất. Nếu mỗi bài kiểm thử tự định nghĩa dữ liệu riêng, bạn sẽ không bao giờ biết mình đã phủ được những gì.
- Kiểm tra cả phần hiển thị, không chỉ phần kiểm tra. Với thẻ mười lăm chữ số, hãy xem cách nhóm chữ số trên giao diện có bị lệch hay không. Với thẻ có mã bảo mật bốn chữ số, hãy xem nhãn hướng dẫn có đổi theo hay không.
- Đừng để một mạng thẻ chi phối toàn bộ bộ kiểm thử. Nếu tám trong mười ca đều là thẻ của một mạng, bạn đang kiểm thử một sản phẩm khác với sản phẩm bạn phát hành.
- Ghi lại nguồn của các dải tiền tố. Khi một bài kiểm thử bắt đầu thất bại, bạn cần biết dải tiền tố đó đến từ tài liệu công khai nào để kiểm tra xem nó còn đúng hay không.
- Cẩn thận với dải tiền tố chồng lấn. Đây là nguồn gốc của những lỗi nhận diện sai mạng thẻ khó tái hiện nhất, vì chúng chỉ xuất hiện với một vài tiền tố cụ thể.
Về phía dữ liệu, hãy đảm bảo rằng mọi bản ghi thử đều là dữ liệu tổng hợp. Ngay cả khi bạn chỉ cần một thẻ để thử nhanh, thói quen dùng dữ liệu hư cấu từ đầu sẽ giúp bạn không phải dọn dẹp về sau và không vô tình đưa dữ liệu thật vào môi trường không được bảo vệ.
Tiếp theo
Nếu bạn đang chuẩn bị cho một buổi kiểm thử biểu mẫu thanh toán hoàn chỉnh, danh sách kiểm tra biểu mẫu thanh toán tổng hợp những trường hợp cần phủ theo thứ tự thực tế. Còn nếu bạn muốn hiểu vì sao môi trường thử cũng nằm trong phạm vi của các tiêu chuẩn bảo mật, bài dữ liệu thử theo chuẩn PCI DSS sẽ giải thích những ràng buộc mà đội phát triển cần tuân theo.