מה באמת מגן על טופס: CAPTCHA, שדה מלכודת, מלכודת זמן, CSRF
רוב טופסי יצירת הקשר מסתמכים על טריק אחד נגד ספאם, ורבים מהטריקים האלה עוצרים רק את הבוטים הפשוטים ביותר. מה כל שכבת הגנה עוצרת, מה העלות שלה ואיזה שילוב הגיוני.
ספאם דרך טופסי יצירת קשר מגיע לעיתים רחוקות מאדם שמקליד ידנית. לרוב זו תוכנה שמוצאת טפסים, ממלאת כל שדה ושולחת את התוצאה — אלפי פעמים. קיימים כמה אמצעי הגנה, והם פועלים בנקודות שונות מאוד. הכרת הפעולה האמיתית של כל אחד עוזרת להימנע משתי טעויות: טופס ללא הגנה אמיתית וטופס שמוגן בכבדות כזו שאנשים אמיתיים מוותרים.
- שדה מלכודת: בוטים פשוטים שממלאים כל שדה
- מלכודת זמן: סקריפטים ששולחים מיד לאחר הטעינה
- CAPTCHA: רוב האוטומציה הכללית
- אסימון CSRF: בקשות שנשלחות ישירות לנקודת הקצה
- הגבלת קצב: הצפות ממקור יחיד
- הוכחת עבודה: שליחות המוניות זולות, ללא מעקב או חידות
- בדיקות בצד השרת: כל מה שעוקף את הדפדפן
- בוטים ממוקדים מדלגים עליו; אם הוא מוסתר בצורה לקויה, קוראי מסך מקריאים אותו
- בוטים שממתינים; ללא חתימה בצד השרת קל לזייף אותה
- מכשול לכולם, חסמי נגישות, לעיתים קרובות צד שלישי; קיימים שירותים לפתרון
- בוטים שטוענים תחילה את הדף מקבלים גם הם אסימון תקף
- ספאם שמפוזר על פני כתובות IP רבות
- שולח נחוש עם כוח חישוב; דורש JavaScript
- שום דבר בפני עצמן — אבל בלעדיהן כל שכבה אחרת היא קישוט
שדה מלכודת ומלכודת זמן: מסננים בלתי נראים
שדה מלכודת הוא שדה נוסף שאנשים לעולם אינם רואים, למשל שדה בשם ״website״ שמוסתר באמצעות CSS. בוטים פשוטים ממלאים כל שדה, ולכן שדה מלכודת מלא מעיד על אוטומציה והשרת יכול להשליך את ההודעה בשקט. בוטים שנכתבו עבור האתר, או כאלה שמרנדרים את הדף כמו דפדפן, מדלגים עליו. חשוב להסתיר אותו נכון: שדה שרק הוזז אל מחוץ למסך עשוי להיקרא על ידי קוראי מסך, לקבל מיקוד באמצעות מקש Tab או להתמלא במילוי אוטומטי. יש להשתמש ב-aria-hidden, ב-tabindex -1 וב-autocomplete off, לצד תווית ניטרלית שמבקשת מכל מי שמגיע לשדה להשאיר אותו ריק.
מלכודת זמן מתעדת מתי הטופס נמסר ודוחה שליחות שמגיעות במהירות בלתי סבירה. אנשים זקוקים לכמה שניות כדי לקרוא ולהקליד; סקריפטים רבים שולחים בתוך שבריר שנייה. יש לבדוק את חותמת הזמן בשרת ולהגן עליה מפני שינוי, למשל באמצעות חתימה או שמירה בהפעלה — הבוט פשוט יכתוב מחדש שדה זמן נסתר רגיל. כדאי לשמור על סף נמוך, משום שמילוי אוטומטי מאפשר גם לאנשים אמיתיים לפעול מהר. בוטים שפשוט ממתינים מצליחים לעבור: מלכודת זמן היא מסנן, לא חומה.
CAPTCHA: יעיל, אבל לא ללא עלות
CAPTCHA דורש הוכחה שלא פועל כאן בוט — מחידות תמונה ועד בדיקות שרצות ברקע; שירותים נפוצים כוללים reCAPTCHA, hCaptcha, Cloudflare Turnstile ו-Friendly Captcha. הוא עוצר את רוב האוטומציה הכללית, ולכן הוא פופולרי כל כך. אבל כל חידה גלויה היא מכשול שחלק מהמבקרים מוותרים בו, ורוב השירותים טוענים סקריפט של צד שלישי, מה שמעלה שאלות של פרטיות והסכמה. CAPTCHA עוזר רק אם הוגדר נכון: מפתח אתר ציבורי לבדיקות, רכיב ללא הסקריפט שלו או אסימון שהשרת לעולם אינו מאמת נראים כמו הגנה, אבל אינם כאלה. בדיקה חינמית ב-formexposed.com מצביעה על שגיאות כאלה מבחוץ.
נגישות היא חלק מהעלות הזאת. חידות תמונה מונעות גישה מאנשים עיוורים ומאנשים רבים עם ראייה ירודה, חלופות שמע אינן עוזרות לאנשים עם חירשות-עיוורון, ומשימות לוגיקה מסובכות מכבידות על אנשים עם מוגבלות קוגניטיבית. קריטריון ההצלחה 1.1.1 של WCAG 2.2 מחייב חלופת טקסט שמתארת את מטרת ה-CAPTCHA וצורות חלופיות לחושים שונים. בדיקות רקע מונעות את רוב הבעיות האלה, אך כשהן מזהות חשד, חלופת הגיבוי היא לעיתים שוב חידה חזותית — יש לבדוק את המסלול הזה עם מקלדת וקורא מסך.
אסימון CSRF: הגנה מפני זיוף, לא מפני ספאם
אסימון CSRF הוא ערך אקראי שהשרת מכניס לטופס ומצפה לקבל בחזרה. הוא נועד למנוע זיוף בקשות בין אתרים, שבו אתר אחר גורם לדפדפן של מבקר לשלוח בקשה שהמבקר לא התכוון לשלוח. בטופס יצירת קשר ציבורי יש לו תופעת לוואי: בוטים ששולחים ישירות לכתובת הטופס בלי לטעון את הדף נדחים. כל בוט שמביא את הדף ושולח את האסימון בחזרה מצליח לעבור. רוב מסגרות הפיתוח ותוספי הטפסים ממילא כוללים אסימוני CSRF — יש להשאיר אותם פעילים, אבל לא לספור אותם כהגנה מספאם.
מה חייב לקרות בשרת
- יש לאמת מחדש כל שדה בשרת: שדות חובה, אורך, תבנית כתובת דוא״ל והיעדר מעברי שורה בשדות שמגיעים לכותרות דואר.
- יש לאמת אסימוני CAPTCHA והוכחת עבודה בכל שליחה, מול השירות שהנפיק אותם או בקוד המקומי, ולדחות אסימונים שנעשה בהם שימוש חוזר.
- יש להגביל שליחות לפי כתובת IP וחלון זמן. זה עוצר הצפות ממקור יחיד; ספאם שמפוזר על פני כתובות רבות דורש שכבות נוספות.
- כדאי לשקול הוכחת עבודה: לפני השליחה, הדפדפן פותר משימת חישוב קטנה. המבקרים אינם רואים חידה ולא מתבצע מעקב, אבל שליחה המונית הופכת ליקרה.
שילוב הגיוני: שתיים או שלוש שכבות
- 1כדאי להתחיל בשכבות הבלתי נראות: שדה מלכודת נגיש ומלכודת זמן חתומה, ששניהם נבדקים בשרת.
- 2יש להוסיף הגבלת קצב לפי כתובת IP, כך שמקור יחיד לא יוכל להציף את הטופס.
- 3אם ספאם ממוקד עדיין עובר, יש להוסיף הוכחת עבודה או CAPTCHA — רצוי ללא חידה גלויה ועם חלופה נגישה.
- 4יש להשאיר את אסימון ה-CSRF שמסגרת הפיתוח מספקת — כתוספת, לא כהגנה.
- 5יש לבדוק את התוצאה כמבקר — עם מקלדת בלבד, עם קורא מסך ובטלפון — ולוודא שהודעות אמיתיות עדיין מגיעות.
באתרים רבים, שדה מלכודת, מלכודת זמן והגבלת קצב יחד כבר מסירים את רוב הספאם הכללי ללא מכשול גלוי; CAPTCHA נשמר למקרים שבהם זה לא מספיק. ב-WordPress, תוסף formexposed החינמי משלב שדה מלכודת, בדיקת זמן והוכחת עבודה בלי צורך ב-Google. כדי לראות מה הטופס מציג מבחוץ — אילו שכבות קיימות ואם CAPTCHA מוגדר ביעילות — בדיקה חינמית ב-formexposed.com זקוקה רק לדומיין, ללא חשבון. היא אינה יכולה לראות את קוד השרת, ולכן החלק בצד השרת נשאר באחריות מפעילי האתר.