הקוד הקצר שמודפס על כרטיס תשלום הוא השדה שאנשים מהססים מולו כשהם מקריאים כרטיס בקול, וההיסוס הזה הוא כל העניין. CVV הוא סוד נפרד שחי רק על הפלסטיק, לא במספר הכרטיס, לא בתאריך התוקף, ולא בכל דבר שגנב יכול לשחזר מקבלה. הוא נוסף מפני שתשלומים ללא נוכחות הכרטיס היו זקוקים לראיה כלשהי שלמי שמקליד את הפרטים היה הכרטיס ביד.
המאמר הזה מסביר מהו הקוד, למה אורכו משתנה בין רשתות, למה כללי תשלום אוסרים לשמור אותו, ומה כדאי לבדוק כשבונים או בודקים טופס שמבקש אותו.
מהו קוד האבטחה ואיפה הוא מודפס
ברוב הרשתות הקוד הוא שלוש ספרות שמודפסות בגב הכרטיס, בתוך פס החתימה או מיד לצידו. American Express מציבה ארבע ספרות בחזית הכרטיס, מעל הקבוצה האחרונה של מספר הכרטיס.
הערך מופק על ידי המנפיק בעת ייצור הכרטיס. הוא אינו נגזר ממספר הכרטיס, הוא אינו סכום ביקורת, ואי אפשר לחשב אותו מכל דבר אחר שמודפס על הכרטיס. אם הקוד אבד אין דרך לשחזר אותו בחשבון; המנפיק צריך להנפיק כרטיס חדש.
התיעוד משתמש בכמה שמות לקוד, והמספור בשמות האלה משמעותי ולא קישוטי. המונח הפשוט מתאר נתונים שמקודדים בפס המגנטי או בשבב, ואילו הגרסה שממוספרת בשתיים היא הערך המודפס שהלקוח מקריא. בדיקה של מסוף עם נוכחות כרטיס ובדיקה של עמוד תשלום נוגעות אפוא בשדות שונים, גם אם השמות נשמעים חלופיים.
| משפחת רשתות | אורך הקוד | היכן הוא מודפס |
|---|---|---|
| Visa, Mastercard, Discover, UnionPay | שלוש ספרות | גב הכרטיס |
| American Express | ארבע ספרות | חזית הכרטיס |
למה הקוד בן שלוש ספרות בכרטיסים מסוימים וארבעה באחרים?
ההבדל נובע מתכנית המספור שכל רשת בחרה, ולא מהבחנה ביטחונית. קוד בן ארבע ספרות אינו חזק מקוד בן שלוש ספרות בשום מובן ממשי; שניהם קצרים מספיק כדי שניחוש אינו מודל האיום. האורך הוא פשוט חלק מהמפרט של הרשת, באותו אופן שבו מספרי הכרטיס שלה משתמשים במספר ספרות אחר.
עבור מי שבונה טופס, העובדה הבודדת הזו מייצרת את רוב התקלות בתחום. שדה שקודד קבוע לשלושה תווים חותך קוד של American Express בלי להודיע למשתמש, ומאמת שמתעקש על שלוש ספרות דוחה כרטיס לגיטימי. הגישה המעשית היא לבקש מהמשתמש תחילה את המותג, או לזהות אותו מתוך המספר, ולהתאים את גודל השדה בהתאם—עם גבול עליון שדוחה בכל זאת קלט מופרך.
מה הקוד מוכיח ומה הוא אינו מוכיח?
בעסקה ללא נוכחות הכרטיס הסוחר אינו רואה את הכרטיס, ולכן מערכת התשלום מבקשת משהו שמי שמחזיק בו יכול לקרוא. המספר ותאריך התוקף היו יכולים להיות מועתקים מחשבונית ישנה או ממסד נתונים שדלף; הקוד המודפס לא, מפני שהוא מעולם לא נרשם בשום מקום אחר.
זה הופך אותו למכשול צנוע אך ממשי בפני הונאה מזדמנת, וזו הסיבה שהשדה אינו קישוט. הרשתות מתייחסות לקוד כראיה לכך שעסקה עמדה ברף אימות גבוה יותר, וסוחרים שאוספים אותו כראוי מטופלים אחרת מאלה שלא, כשמחלוקת על הונאה מגיעה לדיון. התנאים המדויקים של העברת האחריות שייכים לרשתות; המסקנה המעשית למי שבונה טופס היא שהשדה צריך להיאסף, ולא להיות מדומה.
מה שהקוד אינו מוכיח הוא שהכרטיס אמיתי או שהחשבון במצב תקין. ערך מנוחש בצורה הנכונה עובר כל בדיקה בצד הלקוח באופן מיידי, מפני שלטופס אין דרך לאמת סוד שהוא אינו רואה. רק בקשת אישור מול המנפיק יכולה לענות על השאלה הזו.
למה כללי הכרטיסים אוסרים לשמור את הקוד?
זה הכלל שמפתיע צוותי הנדסה יותר מכולם. לפי תקן אבטחת הנתונים של תעשיית הכרטיסים, קוד האבטחה מסווג כנתוני אימות רגישים. מותר להשתמש בו כדי לאשר עסקה, ואסור לשמור אותו לאחר האישור—לא בעמודה במסד נתונים, לא בקובץ יומן, לא בגיליון אלקטרוני, ולא בהודעה בתור שתהליך רקע צורך עשר שניות אחר כך.
ההיגיון פשוט. קוד שנשמר הוא אמצעי תשלום שנשמר. אם פרצה חושפת מספרי כרטיס, התוקף עדיין זקוק למשהו נוסף כדי להשתמש בהם ברשת; אם היא חושפת גם את הקודים, המספרים הופכים לשמישים באופן מיידי.
בסקירה, התקלות לעיתים רחוקות נראות כמו בחירות מכוונות:
- עמודה שנוספה לטבלת ההזמנות עבור מפגש ניפוי אחד ומעולם לא הוסרה.
- תוכנת תיעוד בקשות שרושמת את גוף הבקשה כולו, קוד בכללו, אל שירות איסוף שכללי הגישה אליו חלשים מאלה של מערכת התשלום.
- מדווח שגיאות שמצרף את גוף הטופס הכושל לכל חריגה.
- תור ניסיונות חוזרים ששומר את בקשת החיוב המקורית בשלמותה כדי לאפשר הרצה חוזרת.
כל אחד מאלה הוא כשל תאימות, ואף אחד מהם אינו נראה כך ברגע שנכתב.
מילוי שדה קוד אבטחה בלי טעויות
רוב הקושי כאן הוא הקלדה ולא אבטחה, והמקרים המסורבלים צפויים מספיק כדי לתכנן להם:
- קוד ארוך מהשדה. מישהו מדביק ארבע ספרות לתיבה בת שלושה תווים. אפשר לחתוך בשקט או להציג הודעה, אבל כדאי לבחור התנהגות אחת ולהחיל אותה באופן עקבי.
- קלט שאינו ספרות. אותיות, רווח, מקף מבלוק שהועתק. השדה צריך לסרב להם בלי למחוק את מה שהמשתמש כבר הקליד.
- אפסים מובילים. קוד שמתחיל באפס הוא חוקי ואסור לנרמל אותו באמצעות פענוח הערך כמספר.
- הסתרה. הסתרת הספרות תוך כדי הקלדה נראית מרגיעה, אבל כדאי לוודא שהיא אינה שוברת מילוי אוטומטי או גורמת לדפדפן להתייחס לכל עמוד התשלום כמסך התחברות.
- מקלדות במכשירים ניידים. לוח מקשים מספרי מהיר יותר לשימוש, וזה חשוב בשדה שמקלידים כשהכרטיס מוחזק ביד השנייה.
למפתחים: הרחקת הקוד מיומנים ומאחסון
המשמעת ההנדסית כאן היא חיסור. הטיפול הבטוח ביותר בנתוני אימות רגישים הוא לא להחזיק אותם במערכת בשום נקודה מלבד רגע האישור.
מתחילים בסקירה של מה ששכבת התיעוד באמת קולטת. תשתית שמתעדת גופי בקשות כברירת מחדל תרשום את הקוד, ויעד היומן הוא לעיתים קרובות שירות חיצוני שכללי הגישה אליו שונים. אם הקוד אינו מגיע לשרת כלל—מפני ששדה תשלום מתארח אוסף אותו ישירות—הבעיה נעלמת, וזו האפשרות החזקה ביותר שעומדת לרשות הצוות.
במקומות שבהם הערך כן עובר בטיפול, יש להתייחס אליו כאל ערך חולף. אין להוסיף אותו לאובייקט מודל שמסודר לשורת ביקורת, אין לכלול אותו במטען של ניסיון חוזר, ואין לתת למטפל חריגות לצרף אותו לדוח. כדאי לכתוב בדיקה שסורקת את פלט היומן לאחר הרצה ונכשלת אם מופיע בו ערך בצורת קוד; בדיקה אחת כזו תופסת את רוב המקרים של שמירה בשוגג.
לאחר מכן יש להסתכל על נתוני הבדיקה. כל דבר שממלא את השדה אוטומטית צריך לבוא מערכים בדיוניים, שנבדקו באותה הקפדה כמו כל מתקן תשלום אחר. הערות PCI DSS מכסות את הכללים הרחבים יותר בדבר מה שמותר שיתקיים בסביבת בדיקה, ורשימת הבדיקות לטופס תשלום ממקמת את השדה הזה בתוך רצף הזרימות שכדאי להפעיל לפני עלייה לאוויר.
כרטיסי בדיקה וקודי מציין מקום שלהם
כרטיס מופק זקוק לקוד שימלא את השדה, והערך הזה הוא מציין מקום בדיוק כמו שאר הכרטיס. יש לו האורך הנכון ומערך התווים הנכון, והוא אינו מתאים לשום סוד שנמצא בידי מנפיק כלשהו.
זו הדרך המדויקת לתאר את כל מה שהמחולל באתר הזה מחזיר: נתונים תקפים מבנית שמעולם לא הונפקו. קוד מציין מקום הופך הדגמה או בדיקה בסביבת במה לשלמה, והוא לא יאשר דבר בשום מקום. השימוש בכל אלו הוא לבדיקות תוכנה בלבד.
צעדים הבאים
כדאי לבדוק טופס אחד בבעלות הצוות בשלושה דברים ובסדר הזה: האם השדה מסתגל לאורך הקוד של הרשת, האם הערך מגיע ליומן כלשהו או לטבלה כלשהי, והאם הודעות השגיאה מבדילות בין אורך שגוי לבין תו לא נתמך. כדי לשייך מספר לשדה הזה, משתמשים במחולל מספרי הכרטיס, ולתאריך שיושב לצידו—מדריך תאריך התוקף מכסה את כללי הגבול.