תפריט

אימות מספרים: סט תווים, אורך וספרת ביקורת

אימות מספרים מאחד שלוש שכבות — סט תווים, אורך וספרת ביקורת — ויכול להסתיים בארבע תוצאות שונות בכנות. כך פועלת כל שכבה ומה היא מוכיחה.

פורסם

  • נתוני בדיקה
  • אימות
  • ספרת ביקורת

אימות מספרים הוא השגרה שמחליטה אם מחרוזת תווים רשאית לייצג חשבון, מסמך או מוצר. זו אינה בדיקה אחת אלא שלוש בדיקות, בסדר קבוע: האם כל תו חוקי, האם המחרוזת באורך המתאים, והאם הספרה שסוגרת אותה מתיישבת עם החשבון של התווים שלפניה.

כל שכבה תופסת סוג שונה של טעות, וכל אחת מהן עונה על שאלה צרה בהרבה ממה שנהוג להניח. המדריך הזה עובר על שלוש השכבות לפי הסדר, מסביר מדוע בדיקה שעברה אינה טענה על העולם, ומראה מאין מגיעות ארבע התוצאות האפשריות של מאמת.

מהו אימות מספרים?

בפשטות, אימות הוא מסנן שמפריד בין קלט שהמערכת יודעת לעבד לבין קלט שהיא אינה יודעת לעבד. המסנן בנוי מכללים מפורסמים ולא מסודות, וזו הסיבה שאותה בדיקה יכולה לרוץ בדפדפן, בתהליך ייבוא לילי ולצד תווית מודפסת בלי שאף אחד מהשלושה יחלוק על האחר.

המונח נמתח לעתים קרובות לשתי פעילויות שאין ביניהן קשר. האחת מבנית: האם המחרוזת מצייתת לתבנית שהסכמה שלה מגדירה? האחרת עובדתית: האם המספר הזה הונפק אי פעם, ואם כן למי? רק הראשונה שייכת למאמת. השנייה מצריכה שליפה מול המרשם שהנפיק את הערך, ושגרה שרצה ללא גישה לרשת אינה מסוגלת לבצע אותה כלל.

ההפרדה בין השתיים היא כל העניין של התרגיל. טופס שמדווח על מבנה תקין כעל זהות מאושרת יעביר שטויות בביטחון מלא, והמשתמש בצד השני יאמין לו. לעומת זאת טופס שמסרב לקבל מספר תקין לחלוטין ומודיע על כך בשפה של כשל, שולח את המשתמש לחפש בעיה שלא קיימת.

כל מספר ומחרוזת המתוארים במאמר הזה הם המחשה שנבנתה במכוון, ונכתבו רק כדי להראות כיצד שלוש השכבות מתנהגות. אף אחד מהם אינו מייצג חשבון, מסמך או חבילה אמיתיים, ובדיקה שעברה בתוך המחשה אינה ראיה לכך שרשומה כזו קיימת אי פעם.

שלוש שכבות סינון: סט תווים, אורך וספרת ביקורת

השכבות זולות להרצה, וכל אחת מהן עיוורת בדיוק לכשלים שהאחרות תופסות.

שכבה מה היא שואלת מה היא תופסת מה היא מפספסת
סט תווים האם כל התווים חוקיים כאן? אותיות שהוקלדו בשדה מספרי, סימנים זרים, סימני עיצוב שהודבקו ממקום אחר ספרה שגויה שהיא עצמה חוקית
אורך האם המחרוזת בגודל שהסכמה מתירה? תו שנשמט או הוכפל בזמן ההקלדה מחרוזת באותו אורך שבה הוחלפו שני תווים שכנים
ספרת ביקורת האם הספרה הסוגרת נובעת משאר התווים? רוב השגיאות של תו בודד ורבים מההיפוכים בין תווים שכנים כל ערך שמעולם לא הונפק

סדר הפעולות חשוב לא פחות מהתוכן. מנרמלים קודם, אחר כך בודקים את סט התווים, אחר כך את האורך, ורק אז מריצים את החשבון. שגרה שמחשבת ספרת ביקורת לפני שהוסרה נקודת פיסוק תסרב לערכים תקינים לחלוטין, ותעשה זאת עם הודעה שמפנה את המשתמש לבעיה שאינה קיימת.

גם זיהוי השלב שנכשל הוא חלק מהתוצאה. הודעה שמייחסת כשל חשבוני לסט תווים גרועה מהודעה סתמית, כי היא שולחת את מי שקורא אותה לתקן את הדבר הלא נכון.

מדוע מעבר של התבנית אינו הופך מספר לאמיתי?

ספרת ביקורת היא תקציר חשבוני של התווים שלפניה. היא מחושבת מהתווים האלה בלבד, ולכן היא מוכיחה עקביות פנימית ולא דבר מעבר לכך. כל מי שמכיר את הכלל המפורסם יכול להפיק מחרוזת שמקיימת אותו, וזה בדיוק מה שמחולל עושה בכוונה.

מה שהבדיקה אינה יכולה לראות הוא המרשם. האם חשבון פתוח, האם מסמך הודפס אי פעם, האם מוצר נארז אי פעם—כל זה יושב במסד נתונים שנמצא בידי רשות שאין למאמת כל גישה אליה. ערך יכול לקיים כל שכבה שעובדת ללא רשת ובכל זאת לא להתאים לשום דבר; מדריך אימות מספרי הזהות עובר על המשמעות של זה בתכניות זיהוי במיוחד.

המסקנה המעשית היא להתייחס לתוצאה כאל אמירה על המחרוזת, ולעולם לא כאל אמירה על העולם. המסגור הזה שומר על הודעות שגיאה כנות, ומונע ממבקרים לקרוא לסימן ירוק יותר משאפשר לשאת.

מספר אחד יכול להשתייך לכמה סכמות

סכמות חופפות זו לזו. שתי שיטות מספור בלתי תלויות יכולות להסכים על סט התווים החוקי, על האורך הכולל ואפילו על החשבון של התו הסוגר, ואז אותה מחרוזת היא איבר אמיתי בשתיהן. אין בכך פגם; זה מה שקורה כשמתכננים נפרדים נשענים על מוסכמות דומות.

מאמת שמכריז על מדינה אחת משוערת מסתיר את העמימות וממציא מידע שאין לו. ממשק טוב יותר מציג כל סכמה שהמחרוזת אכן מקיימת, ומשאיר למי שקורא להחליט מול איזה מרשם לפנות בשלב הבא.

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

נרמול: רווחים, מקפים ורישיות

קלט אמיתי מגיע מעוצב לעיניים של בני אדם. מספרי חשבון מודפסים בקבוצות, ערכי זהות נושאים נקודות ולוכסנים, ותוויות מערבבות אותיות גדולות וקטנות. שום דבר מזה אינו חלק מהמספר, וכולו צריך לרדת לפני שמתבצעת השוואה כלשהי.

נרמול מסיר את המפרידים, מכווץ רצפים של רווח לבן ומאחד אותיות לרישיות אחת. ההשפעה שלו היא ששתי גרסאות מעוצבות אחרת של אותו ערך הופכות לאותה מחרוזת, וזה מה שהופך זיהוי כפילויות ובדיקות שוויון למשמעותיות מלכתחילה.

שתי אזהרות ראויות להישמר. נרמול אינו תיקון, כי הוא מסיר תצוגה ולא טעויות, ולכן הוא לעולם לא יציל תו שהוקלד לא נכון. והוא גם אינו אמצעי אבטחה: שגרה שמשווה מחרוזות מנורמלות עדיין משווה קלט שאינו מהימן.

נרמול חייב להישמר בצד לצורך הצגה חוזרת. אם שומרים רק את הצורה המנורמלת, אי אפשר עוד להראות למי שקורא היכן היו המפרידים במקור, וקשה יותר להסביר מדוע ערך נדחה.

למפתחים: איך לסדר צינור אימות

יש למדל את הצינור כרצף של שלבים טהורים, שכל אחד מהם מחזיר תוצאה יחד עם סיבה, ולא כביטוי בוליאני אחד שבולע כל הבחנה.

  1. יש לנרמל את הקלט הגולמי ולשמור את הצורה המנורמלת לצד המקור.
  2. יש לוודא את סט התווים ולדחות כל דבר שמחוצה לו לפני שמריצים חשבון כלשהו.
  3. יש לוודא את האורך מול הסכמה שמי שקורא בחר.
  4. יש לחשב את תו הביקורת ולהשוות אותו.
  5. יש להחזיר תוצאה שמפרידה בין בדיקה שנכשלה לבין סכמה שאינה מוכרת.

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

ולבסוף, כדאי להחזיק את הכללים כנתונים. כשסכמה משנה את האורך שלה או את החשבון שלה, עדכון אמור להיות שינוי בתיאור של הכלל, ולא שינוי בלוגיקה שקוראת אותו.

צעדים הבאים

יש לקחת שדה מספרי אחד במוצר ולכתוב איזו משלוש השכבות מגנה עליו היום. אחר כך יש להדביק ערך שמקיים את התבנית אך נכשל בחשבון בכלי אימות המספרים ולקרוא את התוצאה שחוזרת; ההבדל בין בדיקה שנכשלה לבין סכמה שלא זוהתה הוא ההבחנה שרוב הטפסים עדיין מטשטשים.

המשך קריאה

מדריכים בנושא כלי אימות למספרי כרטיסים ולמספרי זהות