אפשר להרים שני כרטיסי תשלום משתי רשתות שונות ולראות שהמספרים אינם דומים זה לזה. האחד בן שש עשרה ספרות בקבוצות של ארבע, האחר בן חמש עשרה ספרות בקבוצות של ארבע, שש וחמש, והספרות הסוגרות מצייתות לאותו סכום ביקורת בזמן שהאורכים אינם תואמים כלל. בנייה של מספרי כרטיס לבדיקה לפי רשת היא עבודה מכוונת עם ההבדלים האלה, מפני שאינטגרציה שרואה רק מותג אחד היא אינטגרציה שמעולם לא הריצה את רוב הקוד של עצמה.
המאמר מציג את ההבדלים שחשובים, מראה כיצד קוראים את הטווחים המפורסמים, ומסביר מדוע מספר עם הקידומת הנכונה בכל זאת אינו שייך לאיש.
לכל רשת יש תכנית מספור משלה
רשת כרטיסים רושמת את טווחי הקידומות שהיא מזהה ואת מספר הספרות שכרטיס בכל טווח יישא. הרישום הזה הוא מה שמאפשר למסוף תשלום להחליט, בלי לפנות לרשת, לאיזה מותג שייך הכרטיס והאם המספר סביר בכלל.
התוצאה היא קבוצה קטנה של משפחות ולא צורה אוניברסלית אחת. חלק מהרשתות משתמשות באורך אחד כמעט בלעדית; אחרות תומכות בכמה אורכים לרבדי מוצר או לאזורים שונים. גם קודי האבטחה נבדלים, גם במספר הספרות שהם מכילים וגם בצד הכרטיס שבו הם מודפסים. סט בדיקות שמתעלם מההבדלים האלה יעבור סקירה וייכשל בייצור.
איך בוחרים קידומת למקרה בדיקה?
עובדים מהענף שרוצים לתרגל, אחורה. אם הטופס משנה את הפריסה שלו לפי המותג שזוהה, צריך לפחות מספר אחד לכל מותג שמפעיל פריסה נפרדת. אם לאימות יש ענף למספר בן חמש עשרה ספרות, צריך מספר באורך הזה. אם הקופה מטפלת בקוד אבטחה בן ארבע ספרות, צריך כרטיס שהרשת שלו משתמשת באחד כזה.
לאחר מכן בודקים שהקידומת שנבחרה מפורסמת ולא מומצאת. שימוש בטווח שאף רשת לא רשמה מפיק מספר שהזיהוי של המערכת עצמה ידחה, וזה הופך את הבדיקה לכאורה לכשל בלוגיקת הזיהוי במקום במתקן.
קיצור דרך מעשי הוא להפיק מספר אחד לכל מותג שנתמך ולשמור את כל הסט יחד כמתקן בעל שם, כך שאפשר להפיק אותו מחדש בכל פעם שמותג נוסף או שכלל אורך משתנה.
הטווחים המפורסמים במבט אחד
הטבלה הבאה מסכמת את טווחי הקידומות המתועדים בפומבי ואת הצורות שמתלוות אליהם. היא מתארת תכניות מספור, ולא מוצרים או מנפיקים מסוימים.
| רשת | טווחי קידומת מפורסמים | אורך אופייני | קוד אבטחה |
|---|---|---|---|
| Visa | מתחיל ב-4 | 16 ספרות, וגם צורות של 13 וארוכות יותר רשומות | 3 ספרות, גב |
| Mastercard | 51 עד 55, ו-2221 עד 2720 | 16 ספרות | 3 ספרות, גב |
| American Express | 34 ו-37 | 15 ספרות | 4 ספרות, חזית |
| Discover | 6011, 65, 644 עד 649, ו-622126 עד 622925 | 16 ספרות, צורות ארוכות רשומות | 3 ספרות, גב |
| JCB | 3528 עד 3589 | 16 ספרות, צורות ארוכות רשומות | 3 ספרות, גב |
| Diners Club | 300 עד 305, 36, ו-38 עד 39 | 14 ספרות, וגם 16 בשימוש | 3 ספרות, גב |
| UnionPay | 62 | 16 ספרות, צורות ארוכות רשומות | 3 ספרות, גב |
| Maestro | 50, ו-56 עד 69 | משתנה בתוך גבול התקן | 3 ספרות, גב |
שתי הסתייגויות שייכות לצד הטבלה. הטווחים נרשמים בידי הרשתות ומשתנים מדי פעם, ולכן מזהה צריך להיכתב כך שיסבול תוספות ולא יתייחס לרשימה כסופית. והאורך הוא תכונה של הטווח ולא של המותג כולו: כלל שאומר שלרשת מסוימת תמיד יש שש עשרה ספרות יהיה שגוי בסופו של דבר.
למה גם אורך קוד האבטחה שונה?
השימוש בארבע ספרות ב-American Express אינו שדרוג ביטחוני לעומת שלוש; זו פשוט הצורה שבה כתוב המפרט של הרשת הזו. ההשפעה המעשית נופלת על הטופס, שחייב לדעת כמה תווים לקבל.
אם הממשק מציע שדה אחד עם מקסימום קבוע של שלושה תווים, קוד של American Express ייחתך בשקט, והלקוח יראה כשל שאינו מובן לו. הגישה העמידה היא לקבל את האורך שהרשת מצפה לו לאחר שהמותג ידוע, ולהתיר מקסימום נדיב במעט כשהוא אינו ידוע, כך שהדבקה לא תאבד תו שהמשתמש יזדקק לו בחזרה.
האם קידומת תואמת מעידה שהמספר אמיתי?
לא. הקידומת מספרת לאיזה טווח המספר מתיימר להשתייך, ולא מעבר לכך. כל מחרוזת ספרות שמתחילה בטווח רשום יכולה להיות מושלמת בספרות אמצע שרירותיות ובספרה סוגרת מחושבת, ולהפיק משהו שכל בדיקה מקומית תקבל.
אותו דבר חל על נתונים מופקים: המספר נכון מבנית ומעולם לא הונפק לאף אחד. זו תכונה שכדאי להישען עליה ולא מגבלה, מפני שהיא מאפשרת להשתמש בערך בהדגמה או במתקן בלי סיכון שיתפענח לחשבון אמיתי. היא גם אומרת שבדיקת תבנית שעברה לעולם אינה אמורה להיות מוצגת למשתמש כאישור שהכרטיס שלו קיים. כל הנתונים האלה מיועדים לבדיקות תוכנה בלבד.
למפתחים: בניית מטריצת בדיקות לרשתות
מטריצת בדיקות הופכת רשימה של מותגים לרשימה של החלטות, וכדאי לכתוב אותה בטבלה עם ארבע עמודות: המותג, טווח הקידומת שבו משתמשים, תוצאת הזיהוי המצופה, והתנהגות הטופס שמצפים לקבל כתוצאה.
מכאן שלושה כללים שומרים על המטריצה שמישה. יש לכלול מספר אחד בדיוק לכל התנהגות נפרדת ולא מספרים רבים לכל מותג, מפני שמתקנים כפולים מוסיפים תחזוקה בלי להוסיף כיסוי. יש לרשום את האורך המצופה לכל שורה, כך ששינוי בכלל אורך יופיע כבדיקה שנכשלת ולא כהקלה שלא שמו לב אליה. וכדאי להשאיר לפחות מספר אחד שהקידומת שלו אינה שייכת לאף טווח נתמך, כדי שמסלול המותג הלא מוכר ירוץ ולא יונח.
כדאי לשים לב לפונקציית הזיהוי עצמה. מימושים שמתאימים לפי הספרה הראשונה בלבד מאחדים כל כרטיס בנקאי יחד, ומימושים שבודקים טווחים בסדר שגוי עלולים לתת לטווח צר יותר להיבלע בתוך טווח רחב ממנו. שני הבאגים בלתי נראים עד שמגיע כרטיס מסוים, וזה בדיוק מה שהמטריצה קיימת כדי למנוע.
לבסוף, זיהוי תבנית אינו אישור. מטריצת בדיקות היא אמירה על הקוד של המערכת עצמה, ושום סידור של קידומות לא יגיד אם כרטיס תקף לתשלום. מסלול האימות מכסה את מקומה של הזיהוי בתוך רצף הבדיקות, ומדריך התבנית מסביר כיצד הקידומת מתייחסת לשאר המספר.
הפקת כרטיס אחד לכל רשת
כדי לבנות את סט המתקנים, פותחים את מחולל מספרי הכרטיס, בוחרים רשת ומעתיקים את התוצאה; חוזרים על הפעולה לכל מותג שנתמך, ואז שומרים את האוסף יחד עם הערה איזו התנהגות כל שורה אמורה להפעיל. הפקה במקום העתקת טווחים מתוך תיעוד שומרת על האצווה עקבית פנימית ונותנת כמות שאפשר להרחיב בכל פעם שנוספת שיטת תשלום.
הערות PCI DSS כדאי לקרוא לפני שהסט נשמר במקום משותף, ומדריך כרטיסי הבדיקה של ספק מסביר מתי מספר מתוסרט של סביבת בדיקה הוא בחירה טובה יותר ממספר מופק.
צעדים הבאים
משרטטים את המטריצה, מפיקים כרטיס אחד לכל התנהגות נפרדת, ומוסיפים מתקן לטווח שבכוונה אינו נתמך כדי שמסלול הלא ידוע יישאר מכוסה. לאחר מכן סוקרים את פונקציית הזיהוי מול הטבלה, מהטווחים הצרים לרחבים, כדי לאשר שאף ענף אינו בלתי נגיש.