Menu

CVV là gì và vì sao không được lưu lại

CVV là gì, nằm ở đâu trên thẻ và vì sao quy định của ngành thẻ cấm lưu mã này sau khi giao dịch đã được ủy quyền. Giải thích dễ hiểu cho cả lập trình viên.

Đăng ngày

  • CVV
  • bảo mật
  • thanh toán

CVV là gì? Đó là mã bảo mật ngắn in trên thẻ, thứ mà bạn đọc lên khi đặt hàng qua điện thoại và gõ vào khi thanh toán trực tuyến. Với người dùng, nó chỉ là ba ký tự phải điền cho xong. Với người làm phần mềm thanh toán, đây lại là trường dữ liệu đặc biệt nhất trên toàn bộ biểu mẫu, vì nó là ví dụ rõ ràng nhất về một giá trị mà hệ thống được phép dùng nhưng tuyệt đối không được giữ lại. Bài này giải thích vì sao.

Mã bảo mật nằm ở đâu trên thẻ?

Hầu hết các mạng thẻ in mã bảo mật ở mặt sau, trong dải chữ ký, và mã gồm ba chữ số. Một số mạng thẻ lại in mã ở mặt trước, ngay phía trên hoặc bên cạnh dãy số thẻ, và mã gồm bốn chữ số.

Sự khác biệt này quan trọng với người thiết kế biểu mẫu. Nếu bạn luôn yêu cầu đúng ba chữ số và luôn đặt ô nhập ở vị trí ứng với mặt sau thẻ, một nhóm khách hàng sẽ không biết phải điền gì. Những dòng hướng dẫn như “mã gồm ba chữ số ở mặt sau thẻ” vừa không chính xác với mọi loại thẻ, vừa khiến người dùng phải mở ví ra kiểm tra.

Cách viết an toàn hơn là mô tả chung mà không khẳng định vị trí, sau đó cho phép độ dài linh hoạt tùy theo mạng thẻ đã nhận diện được. Khi hệ thống đã biết đây là thẻ của mạng có mã bốn chữ số ở mặt trước, thông báo hướng dẫn mới nên đổi theo.

Vì sao loại mã này tồn tại?

Trong giao dịch trực tuyến, người bán không nhìn thấy tấm thẻ và không kiểm tra được chữ ký. Mọi thứ chỉ là những con số được truyền qua mạng. Điều đó đặt ra một câu hỏi: làm sao phân biệt người đang gõ số thẻ với người chỉ tình cờ biết được dãy số đó?

Mã bảo mật là câu trả lời. Vì nó được in trên thẻ và không xuất hiện trong dữ liệu mà ngân hàng phát hành chia sẻ cho người bán, việc ai đó đọc đúng được mã này là một bằng chứng gián tiếp rằng tấm thẻ đang thực sự nằm trong tay họ. Nói cách khác, nó chứng minh sự hiện diện của vật lý, chứ không chỉ sự hiện diện của thông tin.

Điều đó cũng giải thích vì sao mã này khác về bản chất so với số thẻ. Số thẻ là một định danh được lưu hành rộng rãi trong nội bộ ngành, còn mã bảo mật là một yếu tố xác thực gắn chặt với vật mang.

Vì sao quy định cấm lưu mã bảo mật?

Nếu mã bảo mật chỉ có giá trị khi nó chứng minh rằng tấm thẻ đang ở trong tay người dùng, thì việc lưu nó lại sẽ phá hủy chính giá trị đó. Một khi mã nằm trong cơ sở dữ liệu, bất kỳ ai đọc được cơ sở dữ liệu đó cũng có trong tay toàn bộ thứ cần thiết để giả mạo một giao dịch, và bằng chứng về sự hiện diện của tấm thẻ biến mất.

Vì lý do này, tiêu chuẩn bảo mật dữ liệu của ngành thẻ quy định rõ rằng dữ liệu xác thực nhạy cảm, trong đó có mã bảo mật và dữ liệu đầy đủ của băng từ, không được lưu lại sau khi giao dịch đã được ủy quyền. Đây không phải một khuyến nghị về thói quen tốt, mà là một yêu cầu có thể bị kiểm tra và đánh giá.

Cần lưu ý một điểm thường bị hiểu sai: quy định không cấm hệ thống đọc mã này. Bạn buộc phải đọc nó để gửi đi xác thực. Điều bị cấm là lưu nó lại sau khi giao dịch hoàn tất.

Mã bảo mật có phải một lớp bảo vệ tuyệt đối không?

Không. Mã bảo mật chỉ là một trong nhiều tín hiệu mà hệ thống chống gian lận sử dụng, và nó có những giới hạn rõ ràng.

  • Nó không bảo vệ được trước một người đã có trong tay tấm thẻ, ví dụ khi thẻ bị mất hoặc bị đánh cắp.
  • Nó không giúp gì nếu dữ liệu thẻ bị lộ từ chính nơi lưu trữ, vì mã không được lưu ở đó theo quy định.
  • Nó không thay thế được các bước xác thực bổ sung mà nhiều khu vực yêu cầu cho giao dịch trực tuyến.

Với người bán, việc yêu cầu mã bảo mật có thể giúp giảm một số loại gian lận và đôi khi giúp được hưởng mức phí tốt hơn. Nhưng nó là một lớp trong nhiều lớp, không phải một lá chắn duy nhất.

Những hiểu nhầm phổ biến về mã bảo mật

Có vài câu hỏi lặp đi lặp lại ở cả phía người dùng lẫn phía đội phát triển, và chúng đáng được trả lời dứt khoát.

  • Mã bảo mật không phải mật khẩu của thẻ. Người dùng không thể đổi nó, và cũng không có giao diện nào để đổi.
  • Mã bảo mật không thay đổi theo từng giao dịch. Nó cố định trong suốt vòng đời của tấm thẻ, khác với những mã dùng một lần trong các phương thức xác thực hiện đại.
  • Mã bảo mật không phải số nhận dạng cá nhân. Nó không gắn với chủ thẻ với tư cách một con người.
  • Việc không lưu mã bảo mật không làm giảm khả năng hoàn tiền hay đối soát. Các quy trình đó dùng những tham chiếu khác do hệ thống thanh toán cung cấp.

Dùng công cụ để thử biểu mẫu

Khi bạn cần thử một biểu mẫu thanh toán, bạn cần những giá trị trông hợp lý ở cả ba trường: số thẻ, ngày hết hạn và mã bảo mật. Trình tạo số thẻ tín dụng giả của trang này sinh ra cả bộ cùng lúc, và bạn có thể chọn số lượng bản ghi cần lấy rồi sao chép tất cả chỉ trong một lần. Điều này tiện khi bạn phải điền thử nhiều biểu mẫu liên tiếp hoặc cần dữ liệu mẫu để trình diễn cho khách hàng xem giao diện.

Một lưu ý nhỏ khi dùng dữ liệu mẫu cho mục đích trình diễn: hãy kiểm tra cả trường hợp mạng thẻ yêu cầu mã bảo mật bốn chữ số ở mặt trước, vì đó là chỗ mà phần hướng dẫn trên giao diện hay bị viết cứng theo giả định ba chữ số ở mặt sau.

Mọi số thẻ và mã bảo mật mà công cụ tạo ra đều là hư cấu. Chúng đúng cấu trúc nhưng chưa từng được phát hành, không gắn với tài khoản nào và không thể hoàn tất một giao dịch thanh toán thật. Chúng chỉ dành cho kiểm thử phần mềm và trình diễn biểu mẫu.

Nếu bạn cần nhiều dữ liệu hơn cho các kịch bản khác nhau, hãy xem thêm số thẻ tín dụng thử nghiệm để biết nên lấy dữ liệu từ đâu, và dữ liệu thử theo chuẩn PCI DSS để nắm những ràng buộc áp dụng cho môi trường thử.

Phần dành cho nhà phát triển

Yêu cầu không lưu mã bảo mật chỉ có ý nghĩa nếu nó được thực thi trong mã nguồn, chứ không chỉ nằm trong tài liệu. Dưới đây là những chỗ mà mã bảo mật thường rò rỉ một cách vô tình.

  • Nhật ký ghi lại toàn bộ yêu cầu. Nhiều thư viện ghi lại nguyên văn phần thân của yêu cầu gửi tới hệ thống thanh toán, và mã bảo mật nằm trong đó. Hãy kiểm tra cả nhật ký truy cập, nhật ký lỗi và nhật ký hiệu năng.
  • Bộ nhớ đệm gỡ lỗi. Các công cụ theo dõi lỗi thường chụp lại đối tượng dữ liệu ở thời điểm xảy ra ngoại lệ. Nếu đối tượng đó chứa mã bảo mật, dữ liệu sẽ được gửi tới một dịch vụ bên ngoài mà không ai để ý.
  • Dữ liệu mẫu trong tệp cấu hình. Các tệp cấu hình mẫu hoặc tệp khởi tạo dữ liệu hay chứa giá trị điền sẵn cho mọi trường của biểu mẫu. Hãy để trống trường mã bảo mật trong đó.
  • Ảnh chụp màn hình và bản ghi phiên. Khi kiểm thử giao diện, biểu mẫu đã điền đủ rất dễ lọt vào ảnh chụp hoặc bản ghi phiên. Hãy dùng dữ liệu hư cấu ngay cả trong những tình huống này.
  • Lưu vào bộ nhớ tạm giữa các bước. Nếu luồng thanh toán có nhiều bước, hãy cẩn thận đừng giữ mã bảo mật trong đối tượng trạng thái của phiên lâu hơn mức cần thiết.

Một cách kiểm tra thực tế: hãy thử gửi một giao dịch thử với một giá trị đặc biệt dễ nhận ra ở trường mã bảo mật, sau đó tìm giá trị đó trong toàn bộ hệ thống lưu trữ và nhật ký của môi trường thử. Nếu bạn tìm thấy nó ở đâu, đó chính là chỗ cần sửa.

Về phần dữ liệu thử, hãy dùng giá trị hư cấu cho trường này ngay cả khi bạn chỉ đang thử trên máy cá nhân. Thói quen dùng dữ liệu tổng hợp từ đầu sẽ giúp bạn không phải dọn dẹp về sau.

Tiếp theo

Nếu bạn đang rà lại toàn bộ biểu mẫu thanh toán trước khi phát hành, hãy dùng danh sách kiểm tra biểu mẫu thanh toán để không bỏ sót những trường hợp biên. Còn nếu câu hỏi là trường ngày hết hạn nên được xử lý ra sao cho đúng, bài định dạng ngày hết hạn thẻ sẽ giải thích quy ước thời điểm hết hiệu lực và những cái bẫy khi nhập liệu.

Đọc tiếp

Bài viết về Trình tạo số thẻ tín dụng giả