結帳頁上有三個欄位是大家填到不用想就會填的:卡號、有效期限,以及那組短短的安全碼。很多人把它當成「卡片密碼」,其實它叫 CVV,比較準確的理解是「證明卡在你手上」的憑證。它的位數很少、看起來很容易猜,但卡片上的 CVV 完全不出現在磁條或感應交易的資料裡,這正是它存在的意義。這篇會說明它的定義、不同卡組織的差異,以及那條常被忽略的規定:授權完成後就不可以再保存它。
CVV 是什麼,為什麼只有幾位數?
CVV 是 card verification value 的縮寫,指的是印在卡片上、用來在無卡交易(例如網路購物或電話下單)中確認持卡人確實持有實體卡的一組數字。它由發卡行在製卡時,用卡片資料與發卡行的金鑰計算出來,所以無法從卡號反推。
它只有三位或四位,看起來防護力很弱,但它的價值不在於「猜不到」,而在於「不會被一般交易流程帶出去」。磁條與感應交易裡並不含這組數值,因此即使有人在實體店面側錄了卡片,也拿不到它;反過來說,任何能讀出完整卡片資料的管道,都可能讓 CVV 一併外洩。理解這個設計意圖,就會明白為什麼「多填幾次」或「先存起來」都是錯的方向。
三位與四位的差別在哪裡
位數與位置的差異,取決於卡組織的設計,而不是銀行的偏好。
| 卡組織 | 位數 | 印刷位置 |
|---|---|---|
| 多數卡組織(含 Visa、Mastercard、銀聯) | 3 位 | 卡片背面簽名欄附近 |
| 美國運通 | 4 位 | 卡片正面,卡號右上方 |
背面三位的那組數字,在不同卡組織的文件裡有不同的正式名稱——有的稱卡片驗證碼,有的稱卡片驗證值——但它們指的是同一個欄位的同一個值。美國運通的四位則印在正面,這一點經常讓第一次使用的人找錯地方。
還有一個常見的混淆:同一張卡上可能同時存在好幾組數字,例如卡號末四位、背面簽名欄的號碼,甚至是印在卡片角落的序號。填表時唯一該放進安全碼欄位的,就是上面那張表對應的那一組。
CVV 跟密碼有什麼不同?
很多使用者以為安全碼是可以改的,就像帳號密碼那樣;實際上它由發卡行在製卡時決定,印在卡片上,持卡人無法設定,也無法變更。換卡時它會跟著換一個新的值。
第二個差別是它不具備「只有你知道」的性質。任何拿到實體卡片的人都能看到它,所以它的任務是證明「卡在現場」,而不是證明「你是本人」。真正用來確認身分的機制是另外一層,例如發卡行的簡訊驗證或 3-D Secure 流程。把這兩件事分清楚,才不會誤以為多檢查幾次安全碼就等於加強了身分驗證。
為什麼表單一定要有這個欄位
既然只有幾位數,能不能乾脆不要這個欄位?對收單方來說,它是無卡交易最基本的防線之一。少了它,任何人只要拿到卡號與有效期限就能嘗試下單;有了它,攻擊者必須先取得實體卡片,或從某個外洩管道拿到這個值。
同時,要求填寫 CVV 也代表商戶必須符合更嚴格的資料保護要求,因為它一進入系統就屬於敏感認證資料。這也是為什麼許多付款流程不讓商戶自己碰到這個欄位,而是直接由金流服務商的元件在付款頁上收集:商戶只看得到「驗證成功」的結果,看不到那個值本身。
安全碼在表單上該怎麼呈現與蒐集?
這個欄位的成敗,往往取決於輸入框本身,而不是驗證邏輯。
- 標籤與說明要指對位置。 多數人只記得「卡片後面那幾個數字」,把位置與常見位數寫在標籤或說明文字裡,比只放縮寫更能減少放棄填寫。
- 位數要跟著卡組織變。 一旦辨識出美國運通,提示就該改成正面四位;把位數寫死成三位,會讓正確的輸入被擋下來。
- 重新付款時不要預先填入。 付款失敗回到表單,卡號與有效期限可以保留,安全碼必須清空,否則那個值只會多活一段時間。
- 錯誤訊息要可行動。 「驗證失敗」幫不上忙,指出「請輸入卡片正面四碼」或「請確認位數」才有意義。
- 接受貼上,但別為它建草稿。 使用者常從備忘錄貼過來,流程要接受;但不該因此產生任何形式的中途保存。
在本站產生測試用的安全碼
測試結帳流程時,安全碼通常不需要任何特定值。本站的虛擬信用卡工具在產生每組測試卡號時,會一併附上對應位數的安全碼:多數卡組織給三位,美國運通這類卡給四位,方便你驗證表單在不同卡組織下的欄位行為。
同樣要提醒:這些號碼與安全碼都是結構正確、但從未發行的合成資料,不對應任何帳戶,無法完成任何實際付款,請只用在測試環境。若想了解測試資料在合規上的界線,可以讀 PCI DSS 測試資料。
給開發者:那個欄位不該落庫
規則本身很短,但落地時常被繞過:授權完成之後,安全碼不得被保存,也不得寫進任何形式的紀錄。
- 不要寫進資料庫。 包含暫存表、除錯用的欄位、使用者草稿,任何會被持久化的地方都不行。
- 不要寫進日誌。 常見的疏漏是把整個請求內容印出來做排查,那一行就會把安全碼留在地上;遮蔽必須在寫入紀錄之前完成,而不是之後補救。
- 不要回顯到前端。 驗證失敗後把原值帶回表單欄位,會讓它出現在網頁原始碼、瀏覽器快取與錯誤回報工具裡。
- 不要在快取或工作階段中長期保留。 若流程必須跨步驟傳遞,也要限制存活時間。
- 傳輸時確保加密。 這一項與其他敏感欄位相同,沒有例外。
驗證規則方面,建議只檢查「三位或四位數字」以及在對應卡組織下應該有幾位,不要比對任何具體值——測試環境裡不存在「正確答案」,那正是它與密碼的本質差異。
下一步
想知道測試環境裡可以放哪些安全碼,直接到產生器產生一組連同安全碼的測試卡。想接著理解另一組常被問到的欄位,讀信用卡有效期限格式;要檢查整張表單還有哪些情況沒測到,讀支付表單測試清單。