
عرض توضيحي تعليمي لـ evercookie يوضح كيف يمكن لتقنيات تخزين المتصفح وذاكرة التخزين المؤقت لـ HTTP إعادة تحديد هوية الزائر بشكل مستمر.
عرض تعليمي لكيفية تعريف المواقع الإلكترونية بك باستمرار — ولماذا لم يعد "محو الكوكيز" كافيًا.
يغرس يوبركوكي معرفًا عشوائيًا واحدًا في 12 متجه تخزين مختلف في المتصفح في آن واحد. في كل مرة تزور فيها، يقرأها جميعًا، ويتوصل إلى إجماع، ويعيد كتابة المعرف في كل مكان. امسح أي مخزن — أو حتى جميع الكوكيز الخاصة بك — وسيقوم الناجون بإعادة توليده بصمت. يُظهر لك الموقع، بلغة بسيطة، أين يختبئ معرفك بالضبط وكم مرة تعرف على متصفحك.
إنها نفس الفكرة وراء evercookie الكلاسيكي لـ Samy Kamkar — بُنيت هنا كأداة تعليمية مفتوحة وشفافة تركز على إعادة توليد التخزين واستمرارية السوبركوكي.
[!IMPORTANT] هذا المشروع يتتبع الزائر عن قصد، للتوعية. إنه يستخدم فقط الطرف الأول، ويخزن فقط معرفًا عشوائيًا، وأعداد الزيارات، وأختام الوقت لأول وآخر زيارة، وتسميات مصدر الاسترداد، ولا يشارك أي شيء مع أطراف ثالثة، ويحتوي على زر "نسياني" حقيقي. لا تعيد استخدامه لتتبع الأشخاص دون علمهم أو موافقتهم — فهذا عكس الهدف. انظر الأخلاقيات.
| المتجه | النوع | يحتاج JS؟ | قابل للإزالة من JS؟ | ما يعلمه |
|---|---|---|---|---|
document.cookie | عميل | نعم | نعم | المتعقب الأساسي |
localStorage | عميل | نعم | نعم | ينجو من مسح الكوكيز |
sessionStorage | عميل | نعم | نعم | تكرار لكل لسان تبويب |
IndexedDB | عميل | نعم | نعم | قاعدة بيانات كاملة ينساها الناس مسحها |
Cache API (caches) | عميل | نعم | نعم | مخزن قابل للبرمجة، منفصل عما سبق |
window.name | عميل | نعم | نعم | يستمر عبر التنقلات |
| OPFS (نظام الملفات الخاص بالأصل) | عميل | نعم | نعم | نظام ملفات معزول تفتقده عمليات التنظيف اليدوية |
| Service Worker + Cache | عميل | نعم | نعم | نص خلفي يعيد تقديم المعرف، حتى بدون اتصال |
ملف تعريف الارتباط الخادم (HttpOnly) | خادم | لا | عبر الخادم | غير مرئي لـJS، مع إرساله مع كل طلب |
| ETag supercookie | خادم | لا | مسح الذاكرة المؤقتة فقط | يتم إعادة المعرف في If-None-Match |
| Last-Modified supercookie |
بالإضافة إلى هذه، تطلب الصفحة من المتصفح تخزينًا ثابتًا (navigator.storage.persist())، مما يعفي نسخ IndexedDB / Cache / Service Worker / OPFS من الإزالة التلقائية — مما يجعل التخلص منها أصعب.
المتجهات الثلاثة القائمة على الذاكرة المؤقتة هي خلاصة الثبات: تعيش في ذاكرة المتصفح المؤقتة HTTP، لذا لا يمكن لـJavaScript (بما في ذلك "نسياني" الخاص بنا) حذفها — فقط مسح ذاكرة المتصفح المؤقتة يفعل ذلك. هكذا يعود المعرف من الموت.
شرح كامل لمتجهات التخزين المنفذة، بالإضافة إلى فكرة HSTS supercookie التي لا تزال مناسبة لهذا المشروع، موجود في docs/techniques.md.
ubercookie/
├── backend/ FastAPI — server-side vectors + the observation log (SQLite)
│ └── app/
│ ├── main.py endpoints: /api/visit, /api/whoami, /api/etag-id,
│ │ /api/lastmod-id, /api/cache-id.js, /api/clear-cookie,
│ │ /api/forget
│ ├── store.py "we've seen this browser N times" memory
│ └── ids.py mint/validate the 32-hex tracking id
└── frontend/ Vanilla JS + Vite — the dashboard and the client vectors
└── src/ubercookie/
├── index.js orchestrator: read-all → consensus → respawn → report
└── vectors/ one self-contained module per storage vector
كيف تعمل الزيارة (frontend/src/ubercookie/index.js):
HttpOnly.يتطلب Python ≥ 3.11 (مع uv) و Node ≥ 18.
make install # backend deps (uv) + frontend deps (npm)
# then, in two terminals:
make backend # FastAPI on http://localhost:8000
make frontend # Vite on http://localhost:5173 (proxies /api → :8000)
افتح http://localhost:5173 وشاهد نفسك تُتتبع. افتح DevTools، احذف بعض المخازن، اضغط إعادة المسح، وشاهدها تُعيد التوليد.
سطر واحد لكلا الخادمين مرة واحدة:
./scripts/dev.sh
make build # → frontend/dist
cd backend && uv run uvicorn app.main:app --port 8000
# open http://localhost:8000
خدمة كلاهما من أصل واحد هو الإعداد الأكثر دقة، لأن متجهات الذاكرة المؤقتة/ETag تعتمد على التخزين المؤقت HTTP الحقيقي من نفس الأصل.
make test # backend pytest (server-side vector logic + observation log)
make build # frontend production build
تمارين اختبارات الخلفية متجهات جانب الخادم وسجل المراقبة. لا يزال سلوك المتصفح يحتاج إلى متصفح حقيقي للتحقق لأن العديد من المتجهات تعتمد على تخزين الأصل، وService Workers، والتخزين المؤقت HTTP.
هذه أداة دفاعية / توعوية. إرشادات مدمجة في التصميم:
يرجى إبقاء أي فرع بنفس الروح: استخدمه لتعليم الناس كيفية عمل التتبع حتى يتمكنوا من الدفاع عن أنفسهم، وليس لتتبعهم سرًا.
MIT — انظر LICENSE.
| خادم |
| لا |
| مسح الذاكرة المؤقتة فقط |
| تم ترميز المعرف في تاريخ المورد المخزن مؤقتًا |
| HTTP cache (نص مدمج المعرف) | خادم | لا | مسح الذاكرة المؤقتة فقط | تم تضمين المعرف في ملف مخبأ immutable |