ספירה ללא עוגייה
במאמר הזה
למונה מבקרים יש משימה אחת לא פשוטה: עליו להבחין בין שני ביקורים. אם אינו מסוגל לכך, אדם אחד שטוען דף מחדש עשר פעמים נראה כמו עשרה אנשים, והמספר באתר הוא בדיה.
הפתרון המקובל הוא עוגייה. האתר הזה אינו משתמש בה. הנה מה שהוא עושה במקום זאת, ולמה נדרשה עבודה כדי שיהיה אפשר לומר את המשפט הזה בכנות.
העוגייה שאיש לא ביקש
עד השנה, כל בקשה למונה פתחה הפעלת PHP. זאת שורת קוד אחת, היא נראית תמימה, ומשמעותה הייתה כי כל מבקר בכל אתר שמשתמש במונה Stats4U קיבל עוגיית הפעלה – שאנחנו הגדרנו, בדף של מישהו אחר, בלי שאף אחד מהצדדים התכוון לכך.
ההפעלה מעולם לא שימשה לדבר. היה קל למצוא לכך הוכחה ברגע שמישהו בדק: התיקייה שבה נשמרות הפעלות הכילה אפס קבצים. במשך שנים היא הגדירה עוגייה באתרים של אנשים אחרים, כדי להחזיק מידע שמעולם לא נכתב ומעולם לא נקרא.
היא הוסרה ממסלול הספירה. כעת הפעלה נפתחת רק כשמישהו יוצר מונה או משנה את הגדרותיו – פעולה שעשה בכוונה, באתר הזה.
מה החליף אותה
ההבחנה בין מבקרים נעשית באמצעות ערך גיבוב. חמישה דברים נכנסים אליו:
- כתובת ה־IP
- סוכן המשתמש
- מזהה המונה
- התאריך של היום
- סוד שמשתנה מדי יום
מתקבלים 16 בתים, וזה מה שנשמר. הם נשמרים במשך יומיים ואז נמחקים. כתובת ה־IP עצמה לעולם אינה נרשמת בשום שלב.
שני ביקורים של אותו אדם באותו יום באותו מונה מפיקים את אותם 16 בתים, ולכן הביקור השני מזוהה כחוזר. מחר אותו אדם יפיק משהו שונה לחלוטין, מכיוון שגם התאריך וגם הסוד השתנו. זה כל המנגנון.
למה הסוד מתחלף
זה החלק שקל לטעות בו, וכאן הוא היה שגוי עד השנה.
הגרסה הישנה השתמשה בסוד קבוע אחד. היא עדיין הפיקה ערכי גיבוב שונים לאנשים שונים, וזה נשמע תקין. אבל משמעות הדבר הייתה שכל מי שמחזיק בסוד הזה יכול לקחת כתובת IP חשודה ולחשב מחדש את ערך הגיבוב שלה עבור כל יום בארכיון – וכך להפוך טבלה של ערכים אנונימיים בני 16 בתים בחזרה לרישום של מי ביקר במה, עד לתחילת התקופה שהמידע כיסה.
הסוד משתנה כעת מדי יום והסודות הישנים נמחקים אחרי יומיים. לאחר מכן איש אינו יכול עוד לבצע את החישוב. זה כולל את מי שמפעיל את האתר הזה, וזאת בדיוק המטרה: הגנה שתלויה בהתנהגות הטובה של המפעיל אינה הגנה, אלא הבטחה.
רזולוציית המסך, ולקח על מחיקת דברים
בעבר נאספה רזולוציית המסך. זהו אות קלאסי ליצירת טביעת אצבע דיגיטלית, והוא לא היה שווה את המחיר, ולכן הוסר מהסקריפט שפועל בדף המטמיע.
זה לא הספיק, וכדאי לכל מי שבונה דברים לאתרים של אחרים לדעת מדוע. הסקריפט נמסר עם משך שמירה במטמון של שבעה ימים, ולכן עותקים ישנים נשארו פעילים בדפדפני המבקרים במשך שבוע לאחר השינוי. גרוע מכך, יש אתרים שכלל אינם מקשרים לסקריפט – הם הדביקו עותק שלו בדפים שלהם לפני שנים, והעותק הזה ימשיך לעשות בדיוק את מה שעשה ביום שבו הודבק, לנצח.
לכן הרזולוציה המשיכה להגיע. הפתרון היה לחייב את השרת לדחות את הערך, בלי קשר לזהות השולח. הסרת איסוף מידע מצד הלקוח עוצרת רק לקוחות חדשים. הסרתו מהשרת עוצרת אותו מיד.
איך בודקים
כל זה אינו שווה הרבה כטענה בלבד, ולכן הנה הפקודה:
- curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie
אם אין פלט, לא הוגדרה עוגייה.
לסיום, אותה הסתייגות כמו תמיד: זהו תיאור של מה שהתוכנה עושה. השאלה אם הדבר עומד בכללים שחלים במדינה מסוימת היא שאלה לאדם שמוסמך לענות עליה, והטקסט הזה אינו תשובה לכך.
עדכון, 11 בספטמבר 2026: מ־27 באוגוסט 2026 הסקריפט שב לקרוא את רזולוציית המסך, את רוחב חלון הדפדפן ואת יחס הפיקסלים בכל אתר שהטמיע אותו. מאז 11 בספטמבר 2026 הוא עושה זאת רק כשבעל האתר מפעיל זאת באמצעות data-screen="1". ללא המאפיין הזה, הסקריפט הנוכחי אינו קורא אף אחד מהשלושה, והשרת כבר אינו שומר אותם גם מעותקים ישנים.