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