מחולל מספרי כרטיסי אשראי מפיק מספרי כרטיס שעומדים בכללי המבנה שטופס תשלום בודק, כדי שאפשר יהיה להפעיל תהליך רכישה בלי שכרטיס אמיתי ייכנס לתמונה בכלל. המספר אינו אמצעי זיהוי, הוא אינו משויך לחשבון, והוא לא יאשר שום עסקה, אבל הוא יעבור את בדיקות התבנית, את כללי קידומת המנפיק ואת ספרת הביקורת שהטופס מפעיל לפני שהוא מעביר משהו הלאה.
המדריך הזה מסביר מה משמעותם של חלקי מספר הכרטיס, מדוע ספרת הביקורת קיימת ומה היא אינה עושה, מדוע קוד האבטחה ותאריך התוקף חייבים להסכים עם המספר ברשומת בדיקה, והיכן עובר הגבול בין סביבת בדיקות לבין סביבה שמחזיקה בנתוני בעלי כרטיסים. בסופו של דבר אפשר לדעת על מה לבדוק בבדיקת טופס תשלום, ומה יש להרחיק מהמאגר לחלוטין.
מה משמעותם של חלקי מספר הכרטיס?
מספר כרטיס הוא מחרוזת ספרות באורך קבוע עם שלושה חלקים. הספרות המובילות מזהות את המנפיק ואת הרשת, הספרות האמצעיות מזהות את החשבון הפרטני בתוך אותו מנפיק, והספרה האחרונה היא ערך ביקורת שמחושב מכל האחרות. האורך הכולל משתנה מרשת לרשת וממוצר כרטיס למוצר כרטיס, וטופס שמניח אורך אחד ידחה קלט תקין.
מספר זיהוי המנפיק הוא הקידומת, והוא מה שמאפשר לטופס להציג את הלוגו הנכון ולהחיל את הכללים הנכונים עוד לפני שהבקשה נשלחת. קידומות של רשתות מרכזיות תופסות טווחים מספריים נפרדים, והטווחים האלה מפורסמים כדי שמערכת תוכל לנתב מספר בלי לפנות לאיש. כשמספר מחולל נושא קידומת מטווח שגוי, הטופס או ידחה אותו לחלוטין, או יתייג את הרשת שלא כהלכה בממשק המשתמש.
החלק האמצעי הוא החלק שהמחולל ממציא. ברשומה בדיונית אין מאחוריו חשבון כלשהו, וזו בדיוק הנקודה. בכרטיס אמיתי הוא מצביע על חשבון מסוים במנפיק מסוים, וזו בדיוק הסיבה שאסור לו להופיע בנתוני בדיקה לעולם.
יש לכך משמעות מעשית לכל מי שבונה מחולל. המספרים הבדיוניים הבטוחים ביותר נשארים בתוך הטווחים המספריים שהרשתות שמרו לבדיקות, כי הטווחים האלה הוגדרו כך שלא יוכל להתקיים בהם חשבון אמיתי. מחולל שמשוטט בכל מרחב הקידומות עלול להפיק בסופו של דבר צירוף ששייך למישהו, ומספר ששייך למישהו אינו נתוני בדיקה עוד, גם אם הופק בתום לב מוחלט.
מדוע קיימת ספרת הביקורת ומה היא מוכיחה
הספרה האחרונה מחושבת כסכום ביקורת משוקלל על הספרות שקדמו לה, לפי כלל שמכונה לרוב אלגוריתם Luhn. תכליתו היא לתפוס שגיאות העתקה: ספרה אחת שהוקלדה בטעות, או שתי ספרות סמוכות שהוחלפו זו בזו, יפיקו כמעט תמיד מספר שנכשל בבדיקה. המאמר על אלגוריתם Luhn עובר על החשבון צעד אחר צעד.
מה שספרת הביקורת מוכיחה הוא צר מאוד, ואי הבנה של זה מייצרת פגמים אמיתיים. היא מוכיחה שהספרות עקביות זו עם זו. היא אינה מוכיחה דבר לגבי קיומו של החשבון, פעילותו של הכרטיס, זמינותם של הכספים או שייכותו של המספר למישהו. טופס שמתייחס לספרת ביקורת תקינה כאימות של משהו מעבר לחשבון הוא טופס שיקבל כל מספר שהוקלד בטעות אך בנוי היטב.
זו הסיבה שמספר מחולל כל כך שימושי בבדיקות. הוא נושא בדיוק את התכונה שהטופס בודק, כלומר עקביות פנימית, ואף אחת מהתכונות שהטופס אינו מסוגל לבדוק. הפער בין שתי הקבוצות האלה הוא המקום שבו חיים רוב הפגמים של טפסי תשלום.
זו גם הסיבה שערכי מציין מקום נכשלים. שדה שממולא בספרה חוזרת, או ברצף עולה קצר, ייכשל בספרת הביקורת ולכן לא יגיע לעולם למסלולי הקוד שבאמת רצוי לבדוק. מספר בדיקה שימושי הוא מספר תקין.
מדוע קוד האבטחה והתוקף חייבים להתאים למספר
רשומת כרטיס היא קבוצה קטנה של שדות שמגבילים זה את זה, וטופס תשלום יקבל צירופים שאף מנפיק לא היה מנפיק בפועל. אורכו של קוד האבטחה תלוי ברשת, ולכן קוד בן שלוש ספרות שמצורף לרשת שמשתמשת בארבע ספרות הוא אי התאמה. תאריך התוקף חייב להיות בעתיד כדי שרוב התהליכים יקבלו אותו, והחודש חייב ליפול בתוך שנים עשר החודשים של לוח השנה.
השאלה אם הכרטיס הוא מוצר חיוב או מוצר אשראי משפיעה גם היא על ההתנהגות בחלק מהתהליכים. חלק מהקופות מתייחסות אליהם באופן זהה וחלק מחילות כללים שונים, ומערך בדיקות שמפעיל רק סוג מוצר אחד לא יגלה את ההבדל לעולם. מחולל שמסוגל להפיק את שניהם, עם רשתות שמתאימות לקידומות, נותן את המגוון הדרוש כדי למצוא את המסלולים האלה.
לאותה מערכת יחסים שייכים גם קידומת המנפיק והמיתוג של הרשת בממשק. אם הטופס מציג את שמה של רשת אחת בעוד הקידומת שייכת לרשת אחרת, אי ההתאמה הוא מקרה בדיקה בפני עצמו, והוא פגם שבודק ידני כמעט אינו נתקל בו מפני שהוא מקליד את המספרים שמוכרים לו.
האם כרטיסי בדיקה רשמיים עדיפים על מחוללים?
ספקי תשלום מפרסמים מספרי כרטיס לבדיקה עבור סביבות הניסוי שלהם, והמספרים האלה הם הבחירה הנכונה למטרה אחת מסוימת: הפעלת ההתנהגות של הספק עצמו. מספר בדיקה מפורסם קשור לתוצאות מתועדות, כמו חיוב שהצליח, חיוב שנדחה או קוד שגיאה מסוים, ושחזור התוצאות האלה תלוי בשימוש באותו מספר בדיוק.
מספרים מחוללים משרתים מטרה אחרת. הם מיועדים לחלקים במערכת שנמצאים בבעלות מי שמריץ את הבדיקה: האימות בצד הלקוח, זיהוי הקידומת, העיצוב, הודעות השגיאה, השמירה, והטיפול באורכים חריגים. סביבת ניסוי לא תחזיק תוצאה מתועדת עבור מספר שהיא לא ראתה מעולם, ולכן מספרים מחוללים מיועדים לכל מה שקורה לפני שהבקשה יוצאת מהאפליקציה.
שתי הגישות משתלבות היטב. משתמשים במספרים מחוללים עבור מכלול רחב של מקרי אימות, ובקבוצה קטנה של מספרים מפורסמים של הספק עבור מספר מועט של בדיקות אינטגרציה שבודקות את תשובות הספק. המאמר על כרטיסי בדיקה של Stripe מכסה את הקטגוריה השנייה, והמאמר על רשימת בדיקות לטופס תשלום מכסה את הראשונה.
בין אם בוחרים במספרים מפורסמים ובין אם במחוללים, יש להחזיק אותם בקוד הבדיקה ולא בקבצי הנתונים שמגיעים לקצה אמיתי. מספר של סביבת ניסוי שנשלח בטעות לשער ייצור יידחה, אבל הסתמכות על הדחייה כמנגנון הגנה אינה בקרה אמיתית.
תכונה נוספת שכדאי לתכנן עבורה היא תאריך תוקף שאינו מתבגר. רשומה עם תוקף קבוע בתבנית תתאר יום אחד כרטיס שפג בחודש שעבר, והבדיקה תתחיל להיכשל מסיבה שאין לה כל קשר לשינוי שנמצא בבדיקה. מחולל שמחשב את התוקף ביחס לתאריך הנוכחי שומר על תוקפה של הרשומה ללא הגבלת זמן, ומוציא מהמערך סוג שלם של כשלים מבלבלים.
מה משמעות PCI DSS עבור חברה שאין לה כרטיסים אמיתיים
תקן אבטחת הנתונים של תעשיית כרטיסי התשלום קובע כיצד נשמרים, מעובדים ומועברים נתוני בעלי כרטיסים. הכלל המרכזי שלו פשוט לניסוח וקל לזלזל בו: סביבת בדיקות אסור שתכיל מספרי כרטיס אמיתיים. לא בקובץ נתוני בדיקה, לא בתסריט זריעה, לא בהערה, ולא ביומן.
הסיבה היא שמספר כרטיס יחד עם שם ותאריך תוקף הם נתונים מוגנים ללא תלות בסביבה שבה הם נמצאים. העתקה של שורת ייצור לסביבת בדיקות יוצרת מקום חדש שמחזיק בנתוני בעלי כרטיסים, בדרך כלל עם בקרות גישה חלשות יותר והיסטוריית גיבוי ארוכה יותר. המאמר על נתוני בדיקה לפי PCI DSS בוחן את ההשלכות לעומק.
עבור צוות שאין בבעלותו כרטיסים אמיתיים, הציות פשוט יחסית. אם כל מספר בסביבה הוא בדיוני ואף כרטיס אמיתי אינו יכול להגיע אליה, שאלת היקף התחולה עונה על עצמה במידה רבה. המשמעת הנדרשת היא לשמור על המצב הזה: לא להדביק מספר אמיתי בדוח תקלה, לא לצלם מסך של קופה חיה, ולא לייבא תמצית מייצור כדי לגרום לנתוני הבדיקה להיראות מציאותיים.
דפוס הכשל הארגוני הוא בדרך כלל כוונה טובה ולא רשלנות. מישהו צריך לשחזר תקלה מייצור, מייבא לשם כך חלק מייצור, ומשאיר את החלק הזה במקום. כלל שאומר שיש להפיק נתוני בדיקה ולא להעתיק אותם קל מאוד לשמור עליו כשהוא מעולם לא הוקל.
אילו מקרי בדיקה של טופס תשלום ראויים לכתיבה
המקרים שתופסים פגמים אמיתיים הם אלה שיושבים על הגבולות. יש לבדוק מספר קצר בספרה אחת ומספר ארוך בספרה אחת מהאורך המצופה בכל רשת נתמכת, ולאמת שהטופס דוחה את שניהם עם הודעה שמשתמש יכול לפעול לפיה. יש לבדוק קידומת ששייכת לרשת שהקופה אינה מקבלת, ולוודא שהדחייה ברורה ולא גנרית.
יש לבדוק את ספרת הביקורת במפורש על ידי לקיחת מספר תקין ושינוי ספרה אחת בתווך, ואחר כך לאמת שהטופס דוחה אותו. המקרה הזה חשוב מפני שהוא מבדיל בין טפסים שבאמת מריצים את סכום הביקורת לבין טפסים שסופרים ספרות בלבד, והסוג השני נפוץ יותר מכפי שהוא צריך להיות.
יש לבדוק עיצוב והדבקה. משתמשים מדביקים מספרים עם רווחים, עם מקפים, ועם רווח מוביל או נגרר, ושדה ששומר את התווים האלה ללא שינוי ייכשל בהמשך השרשרת. יש לבדוק את שדה קוד האבטחה מול האורך המצופה ברשת, ולבדוק תאריך תוקף עבור החודש הקודם ועבור החודש הנוכחי, כי הגבול בין השניים הוא המקום שבו חיים כשלי טעות של יחידה. המאמר על תבנית מספר כרטיס מונה את כללי המבנה שכולם נשענים עליהם.
לאחר מכן יש לבדוק מה קורה אחרי כשל. משתמש שהקליד ספרה בטעות צריך להיות מסוגל לתקן אותה בלי למלא את כל הטופס מחדש, והשגיאה לא צריכה לרוקן את שאר השדות. ההתנהגות הזו כמעט אינה נבדקת ולעיתים קרובות שבורה. מחולל מספרי כרטיסי האשראי באתר הזה בנוי כך שיפיק מספרים בכל הרשתות הנתמכות עם האורך הנכון וספרת ביקורת תקינה, כדי שאפשר יהיה להרכיב מכלול של מקרים כאלה בלי לכתוב ביד רשומת בדיקה לכל אחד מהם.
מהו מספר כרטיס מחולל ומה הוא אינו
מספר כרטיס מחולל הוא נתוני בדיקה בדיוניים. יש לו קידומת תקינה, אורך נכון לרשת שלו וספרת ביקורת תקפה, והוא נועד להפעיל תוכנה. הוא אינו אמצעי תשלום, הוא אינו מונפק על ידי בנק או רשת כלשהם, הוא אינו משויך לחשבון כלשהו, ואין דרך להשתמש בו כדי לבצע רכישה, לאשר עסקה או לעבור אימות אמיתי כלשהו.
אסור להשתמש בו כדי להשיג טובין או שירותים, כדי לבדוק מערכת תשלום חיה מתוך כוונה לבצע עסקה, כדי להתחזות לבעל כרטיס, או כדי לעבור כל בקרה שקיימת כדי להגן על חשבונות אמיתיים. הוא קיים כדי שאפשר יהיה לבדוק טפסים, מפענחים ולוגיקת אימות של מי שמריץ את הבדיקה, ולא לשום דבר אחר.
כשמספר כרטיס משולב עם שם, כתובת ותאריך לידה ברשומה אחת, כל הרשומה היא בדיונית. מבנה נכון ועקביות פנימית הם התכונות שהופכות אותה לשימושית; הן אינן טענות על משהו אמיתי, ואף חלק מרשומה כזו אינו אמור להיות מוצג כפרטיו הפיננסיים של אדם כלשהו.