תאריך תוקף של כרטיס אשראי תופס ארבעה תווים על הפלסטיק וגורם למספר לא פרופורציונלי של תקלות בתוכנה שקוראת אותו. הערך המודפס קצר, אבל הוא נושא שתי מערכות כללים בעת ובעונה אחת: באיזה חודש הכרטיס מפסיק לעבוד, ובאיזו שעה ביום האחרון של אותו חודש הוא מפסיק בפועל. טעות בגבול הזה היא אחת הדרכים הקלאסיות שבהן קופה דוחה כרטיס שעדיין שמיש לחלוטין.
הסעיפים הבאים מסבירים מה משמעות התאריך המודפס, כיצד פועל כלל סוף החודש, למה טפסים ומסדי נתונים שומרים לעיתים נדירות את מה שהכרטיס מציג, וכיצד בודקים את המקרים המסורבלים.
מה המשמעות של התאריך המודפס
התאריך שעל הכרטיס הוא חודש ושנה, כל אחד בשתי ספרות, כשהחודש ראשון: חודש תשע ושנה עשרים ושש, למשל, או חודש אחת ושנה שלושים. אין יום על הכרטיס, וזהו מקור הבלבול הראשון—אנשים מחפשים אותו מפני שלכל תאריך אחר שהם מתעסקים בו יש יום.
החודש והשנה מתארים מתי הכרטיס חדל להיות תקף, ולא מתי הונפק. כרטיס שמודפס עליו תאריך כמה שנים קדימה הוא דבר רגיל, מפני שמנפיקים מחליפים כרטיס בדרך כלל הרבה לפני שהוא פג.
הערך אינו נגזר מכל דבר אחר שעל הכרטיס. הוא אינו סכום ביקורת והוא אינו משפיע על המספר. לכך יש השלכה על בדיקות: אי אפשר להמציא תאריך תוקף בחשבון אריתמטי, ולכן הוא חייב להיות מסופק—וזו הסיבה שכרטיסים מופקים מגיעים עם תאריך מצורף.
האם הכרטיס תקף לכל החודש?
כן. זהו הכלל שמפיל אנשים. כרטיס שמודפס עליו חודש ושנה מסוימים מתקבל עד היום האחרון של אותו חודש, עד הרגע האחרון של אותו יום, באזור הזמן שמערכת האישור של המנפיק משתמשת בו.
כרטיס שמודפס עליו חודש תשע ושנה עשרים ושש שמיש אפוא בשלושים בספטמבר של אותה שנה, והוא מפסיק להיות שמיש ברגע הראשון של אוקטובר. כל מערכת שמנתקת את הכרטיס בראשית ספטמבר, או בחצות של היום האחרון, דוחה תשלומים תקפים לפרק זמן שנמדד בשעות או בימים.
| חודש ושנה מודפסים | היום הראשון שבו תקף | היום האחרון שבו תקף |
|---|---|---|
| חודש 1, שנת 2026 | 1 בינואר 2026 | 31 בינואר 2026 |
| חודש 9, שנת 2026 | 1 בספטמבר 2026 | 30 בספטמבר 2026 |
| חודש 12, שנת 2026 | 1 בדצמבר 2026 | 31 בדצמבר 2026 |
הטבלה מראה גם למה מספר הימים חשוב. פברואר הוא החודש המסורבל, מפני שהיום האחרון בו תלוי בשנה, וטופס או משימת רקע שמניחים עשרים ושמונה ימים יחשבו את הגבול באופן שגוי בשנת מעוברת.
למה טפסים מבקשים שתי ספרות במקום ארבע?
הכרטיסים מדפיסים רק שתי ספרות לשנה כדי לחסוך במקום, והטפסים מבקשים בדרך כלל את אותן שתיים מפני שזה מה שהמשתמש קורא מהכרטיס. המוסכמה הזו מעבירה החלטה אל התוכנה: לאיזו מאה שייך הערך הזה?
הגישה הנפוצה היא להתייחס לשנה בת שתי ספרות כשייכת למאה הנוכחית או לזו שאחריה, לפי מרחקה מהיום. ערך שנה שנראה רחוק בעבר הוא כמעט תמיד שגיאת הקלדה ולא כרטיס מתקופה קודמת, וערך שמפוענח למאה הלא נכונה יידחה כפג תוקף או יתקבל לנצח.
הגישה הבטוחה ביותר לטופס היא לקבל את מה שיש למשתמש, להמיר אותו פעם אחת לייצוג חד משמעי—חודש ושנה בת ארבע ספרות, או יום ראשון ויום אחרון—ולהשתמש בייצוג הזה בכל מקום בהמשך. אין להשוות שנים בנות שתי ספרות ישירות, מפני שההשוואה מגדירה מחדש את משמעות המאה בכל מעבר.
תבנית התצוגה ותבנית האחסון אינן אותו דבר
המחרוזת שהלקוח רואה והערך שהמערכת שומרת הם לעיתים נדירות אותו דבר, וערבוב ביניהם הוא מקור אמין לתקלות.
על הכרטיס ובשדה קלט הערך מופיע כשתי ספרות לחודש ושתיים לשנה. במסד נתונים הוא נשמר לעיתים קרובות כתאריך של היום הראשון בחודש, או כשתי עמודות שלמות נפרדות לחודש ולשנה, או כחותמת זמן של הרגע האחרון שבו הכרטיס תקף. לכל בחירה יש השלכות. חותמת זמן של היום הראשון קלה למיון ולשמירה, אבל היא אינה אומרת דבר על התוקף אלא אם כן מכירים גם את כלל סוף החודש. חותמת זמן של הרגע האחרון מקודדת את הגבול הנכון אבל נראית מדאיגה במסך ניהולי שבו איש אינו מצפה לראות שעה לצד תאריך תוקף.
לאיזו תבנית שלא נבחר, יש להשאיר את ההמרה במקום אחד. התקלה שמופיעה בייצור היא בדרך כלל המרה שנייה שנכתבה בידי מי שלא ידע על קיומה של הראשונה, ושתיהן חלוקות בדעתן בחודש שלם.
טעויות נפוצות בהקלדת תאריך תוקף
השגיאות שאנשים עושים בשדה הזה חוזרות על רשימה קצרה, ולכל אחת מהן יש תגובה סבירה:
- הקלדת שנה בת ארבע ספרות בשדה של שתי ספרות. יש לקבל אותה אם אפשר למפות אותה באופן חד משמעי, ולא להשמיט בשקט את התווים המובילים.
- החלפה בין החודש לשנה. חודש שלוש עשרה ושנה עשרים ושמונה אינם תקפים, ולכן יש לאמת כל חלק מול הטווח שלו ולא רק את השילוב שלהם.
- הזנת חודש עם אפס מוביל בשדה שמצפה לספרה אחת. יש להתייחס לאחת ולאפס אחת כאל אותו חודש.
- הדבקת ערך עם מפריד שהשדה אינו מצפה לו, כמו מקף במקום שבו אמור להיות לוכסן.
- הזנת תאריך שכבר עבר, וזו דחייה שהטופס צריך להסביר ולא רק לסמן.
למפתחים: בקרת קלט ובדיקות גבול
שתי בקרות קטנות מונעות את רוב הכאב הזה. ראשית, הפרדת החודש והשנה לשדות נפרדים, או שימוש בשדה אחד שמכוון באופן נראה לעין את הצורה המצופה, כך שהחלפה בין השניים תהיה בלתי סבירה ולא רק ניתנת לזיהוי. שנית, אימות כל רכיב מול הטווח שלו לפני אימות השילוב, כדי שהמשתמש ילמד איזה חלק שגוי.
לכללי הגבול יש לבדוק את קצוות הטווח ולא את האמצע. ארבעת המקרים שכדאי לרשום הם היום הראשון של החודש המודפס, היום האחרון של החודש המודפס, היום שאחרי היום האחרון, ואותו מקרה של היום האחרון בשנת מעוברת. בדיקה שנכתבה מול אמצע החודש אינה מוכיחה כמעט דבר על הכלל שאמור להיות מוגן.
לאחר מכן יש לבדוק כיצד המערכת מתנהגת כשהשעון זז. אם תוקף שמור מומר פעם אחת ברגע השליחה ואינו נבחן מחדש, טופס שנשאר פתוח על גבול חודש ישלח תאריך שהפך זה עתה ללא תקף. יש להחליט במפורש אם זהו שגיאה ששווה להציג או קצה מקובל, ולוודא שבקשת התשלום וברשומות של המערכת יש אותה תשובה.
קבלת תוקף תואם מכלי הכרטיסים
כל כרטיס שמחולל מספרי הכרטיס באתר הזה מפיק מגיע עם תאריך תוקף שתואם את אותה מוסכמה: חודש ושנה בעתיד, באופן עקבי לאורך אצווה שלמה. העקביות הזו היא מה שהופך סט של מתקני בדיקה לשמיש—בדיקה שמצמידה מספר לתאריך מצפה שהזוג יישאר תקף כל עוד סביבת הבדיקות בשימוש, וזו אחת הסיבות לשמור על נתונים מופקים נכונים מבנית ולא מונפקים כלל.
מי שזקוק לכמה כרטיסים שחולקים תאריך תוקף אחד יכול להפיק אצווה ולבחור מתוכה במקום להקליד את התאריך מחדש, מפני ששנה שהוקלדה בטעות קשה לזהות בקובץ מתקנים. כל הנתונים האלה מיועדים לבדיקות תוכנה בלבד.
רשימת הבדיקות לטופס תשלום מכסה את מכלול הזרימות סביב השדה הזה, ומדריך קוד האבטחה מסביר את ארבעת התווים האחרים שהלקוח קורא מהכרטיס.
צעדים הבאים
כדאי להחליט, בכתב, מה המשמעות שהמערכת מייחסת לתאריך תוקף—חודש, יום ראשון או רגע אחרון—ולהעמיד את ההמרה מאחורי פונקציה אחת. לאחר מכן יש להוסיף את ארבע בדיקות הגבול שתוארו למעלה, כולל מקרה השנה המעוברת, ולאשר שכרטיס שמודפס עליו החודש הנוכחי מתקבל גם ביום האחרון שלו.