תפריט

בדיקות אימות גיל: ספים, גבולות וימים מעוברים

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

פורסם

  • נתוני בדיקה
  • זהות
  • רגולציה

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

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

מאין מגיעים ספי הגיל השונים?

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

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

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

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

מה תאריך לידה בהצהרה עצמית יכול לבסס?

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

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

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

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

כיצד יש לבדוק ערכי גבול?

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

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

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

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

כיצד אזורי זמן משנים את התשובה?

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

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

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

מה עם אנשים שנולדו ביום מעובר?

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

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

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

למפתחים: הפיכת הספים לניתנים להגדרה

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

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

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

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

הצעדים הבאים

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

המשך קריאה

מדריכים בנושא מחולל זהויות ונתוני בדיקה