التواصل مع الدعم

نردّ عبر البريد الإلكتروني، عادةً خلال يومين.

يفحص Google reCAPTCHA هذا الإرسال للحماية من إساءة الاستخدام؛ وتُرسَل بيانات إلى Google. لا يُحمَّل السكربت إلا عند فتح هذا النموذج.

→ كل المقالات

العدّ دون ملفات تعريف الارتباط

لعداد الزوار مهمة واحدة محرجة: عليه أن يميّز بين زيارتين. فإن لم يستطع، بدا شخص واحد يعيد تحميل صفحة عشر مرات كأنه عشرة أشخاص، وصار الرقم على الموقع خيالًا.

الحل المعتاد هو ملف تعريف ارتباط. وهذا الموقع لا يستخدمه. إليك ما يفعله بدلًا من ذلك، ولماذا تطلّب الوصول إلى الصيغة الصادقة لهذه الجملة بعض الجهد.

ملف تعريف الارتباط الذي لم يطلبه أحد

حتى هذا العام، كان كل طلب إلى العداد يبدأ جلسة PHP. إنه سطر واحد من الكود، يبدو غير ضار، لكنه كان يعني أن كل زائر لكل موقع يستخدم عداد Stats4U كان يتلقى ملف تعريف ارتباط للجلسة — نضعه نحن، على صفحة شخص آخر، دون أن يقصد ذلك أيٌّ من الطرفين.

المكوناتIP · UA · IDالتاريخ · ملح يوميالتجزئة16 بايتمدة الحفظيومانالعنوان نفسه لا يُدوَّن أبدًاحين يزول الملح، لا يستطيع أحد إعادة حساب يوم ما — ولا حتى نحن

لم تُستخدم الجلسة في أي شيء قط. وكان الدليل سهل العثور عليه بمجرد أن نظر أحد: المجلد الذي تُخزَّن فيه الجلسات لم يكن يحتوي على أي ملف. لقد ظل يضع ملف تعريف ارتباط على مواقع الآخرين، لسنوات، لحفظ بيانات لم تُكتب قط ولم تُقرأ قط.

أُزيلت الجلسة من مسار العدّ. ولم تعد تبدأ جلسة إلا عندما ينشئ شخص عدادًا أو يعيد ضبطه — وهو إجراء يتخذه عن قصد، على هذا الموقع.

ما الذي حلّ محلها

يُميَّز الزوار بعضهم عن بعض بقيمة تجزئة (hash). تدخل فيها خمسة عناصر:

  • عنوان IP
  • وكيل المستخدم (user agent)
  • معرّف العداد
  • تاريخ اليوم
  • قيمة سرية تتغير كل يوم

والناتج 16 بايت، وهو ما يُخزَّن. يُحفظ يومين ثم يُحذف. عنوان IP نفسه لا يُدوَّن في أي مرحلة.

زيارتان من الشخص نفسه في اليوم نفسه إلى العداد نفسه تُنتجان القيمة نفسها من 16 بايت، فتُعرف الثانية على أنها تكرار. وفي الغد يُنتج الشخص نفسه قيمة مختلفة تمامًا، لأن التاريخ والقيمة السرية تغيّرا كلاهما. هذه هي الآلية كلها.

لماذا تتغير القيمة السرية

هذا هو الجزء الذي يسهل الخطأ فيه، وقد كان خاطئًا هنا حتى هذا العام.

كانت النسخة القديمة تستخدم قيمة سرية دائمة واحدة. وكان ذلك ينتج مع ذلك قيم تجزئة مختلفة لأشخاص مختلفين، وهو ما يبدو جيدًا. لكنه كان يعني أن أي شخص يملك تلك القيمة السرية يستطيع أن يأخذ عنوان IP مشتبهًا به ويعيد حساب تجزئته عن أي يوم في الأرشيف — فيحوّل جدولًا من قيم مجهولة الهوية بطول 16 بايت إلى سجل لمن زار ماذا، بالرجوع إلى أقدم ما تصل إليه البيانات.

أصبحت القيمة السرية الآن تتغير يوميًا، وتُحذف القيم القديمة بعد يومين. وبعد ذلك لا يمكن لأي أحد إجراء الحساب مرة أخرى. ويشمل ذلك من يدير هذا الموقع، وهذا هو المقصود: الحماية التي تعتمد على حسن سلوك المشغّل ليست حماية، بل وعد.

دقة الشاشة، ودرس في حذف الأشياء

كانت دقة الشاشة تُجمع في السابق. وهي إشارة كلاسيكية لأخذ بصمة الجهاز (fingerprinting)، ولم تكن تستحق ثمنها، لذلك أُزيلت من السكربت الذي يعمل على الصفحة المضمِّنة.

لم يكن ذلك كافيًا، والسبب يستحق أن يعرفه كل من يبني أشياء لمواقع الآخرين. يُقدَّم السكربت بمدة تخزين مؤقت تبلغ سبعة أيام، لذا بقيت النسخ القديمة فعّالة في متصفحات الزوار لأسبوع بعد التغيير. والأسوأ أن بعض المواقع لا تربط بالسكربت أصلًا — بل لصقت نسخة منه في صفحاتها قبل سنوات، وستظل تلك النسخة تفعل بالضبط ما كانت تفعله يوم لُصقت، إلى الأبد.

لذلك استمرت دقة الشاشة في الوصول. وكان الحل أن يرفض الخادم هذه القيمة، أيًّا كان مُرسِلها. فإزالة جمع البيانات من العميل لا توقف إلا العملاء الجدد. أما إزالته من الخادم فتوقفه فورًا.

التحقق من ذلك

لا قيمة كبيرة لأي من هذا كمجرد ادعاء، لذا إليك الأمر:

  • curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie

عدم ظهور أي مخرجات يعني أنه لم يُضبط أي ملف تعريف ارتباط.

تنبيه أخير، وهو التنبيه المعتاد: هذا وصف لما يفعله البرنامج. أما هل يفي بالقواعد السارية في بلد معيّن، فهذا سؤال يجيب عنه شخص مؤهل، وهذا النص ليس تلك الإجابة.

إعلان