
शैक्षिक evercookie डेमो जो दिखाता है कि ब्राउज़र स्टोरेज और HTTP कैश तकनीकें किसी विज़िटर को लगातार पुनः पहचान सकती हैं।
एक शैक्षिक प्रदर्शन कि कैसे वेबसाइटें आपको लगातार पहचानती हैं — और क्यों "कुकीज़ साफ़ करना" अब पर्याप्त नहीं है।
ubercookie एक यादृच्छिक आईडी को एक साथ 12 अलग-अलग ब्राउज़र स्टोरेज वेक्टरों में डालता है। हर बार जब आप आते हैं, यह उन सभी को पढ़ता है, एक सहमति लेता है, और आईडी को हर जगह वापस लिखता है। किसी भी एक स्टोर को साफ़ करें — या अपनी सभी कुकीज़ भी — और जीवित बचे वेक्टर चुपचाप इसे पुनर्जीवित कर देते हैं। साइट आपको स्पष्ट भाषा में दिखाती है कि आपकी आईडी कहाँ छिपी है और इसने आपके ब्राउज़र को कितनी बार पहचाना है।
यह वही विचार है जो Samy Kamkar के क्लासिक evercookie के पीछे है — यहाँ एक खुले, पारदर्शी शिक्षण उपकरण के रूप में बनाया गया है जो स्टोरेज रिस्पॉन और सुपरकुकी स्थायित्व पर केंद्रित है।
[!IMPORTANT] यह परियोजना विज़िटर को जानबूझकर ट्रैक करती है, जागरूकता के लिए। यह केवल प्रथम-पक्ष है, केवल एक यादृच्छिक आईडी, विज़िट काउंट, पहली/अंतिम-देखी गई टाइमस्टैम्प, और पुनर्प्राप्ति-स्रोत लेबल संग्रहीत करता है, तीसरे पक्ष के साथ कुछ भी साझा नहीं करता है, और एक वास्तविक "मुझे भूल जाओ" बटन प्रदान करता है। लोगों को उनकी जानकारी या सहमति के बिना ट्रैक करने के लिए इसका दुरुपयोग न करें — यह उद्देश्य के विपरीत है। देखें नैतिकता।
| वेक्टर | प्रकार | JS चाहिए? | JS से साफ़ करने योग्य? | यह क्या सिखाता है |
|---|---|---|---|---|
document.cookie | क्लाइंट | हाँ | हाँ | बुनियादी ट्रैकर |
localStorage | क्लाइंट | हाँ | हाँ | कुकी साफ़ करने से बचता है |
sessionStorage | क्लाइंट | हाँ | हाँ | प्रति-टैब अतिरेकता |
IndexedDB | क्लाइंट | हाँ | हाँ | एक पूरा DB जिसे लोग साफ़ करना भूल जाते हैं |
Cache API (caches) | क्लाइंट | हाँ | हाँ | प्रोग्रामयोग्य स्टोर, ऊपर से अलग |
window.name | क्लाइंट | हाँ | हाँ | नेविगेशन के बीच बना रहता है |
| OPFS (Origin Private File System) | क्लाइंट | हाँ | हाँ | एक सैंडबॉक्स्ड फ़ाइल सिस्टम जिसे मैनुअल सफाई छोड़ देती है |
| सर्विस वर्कर + कैश | क्लाइंट | हाँ | हाँ | पृष्ठभूमि स्क्रिप्ट आईडी को फिर से प्रस्तुत करती है, ऑफ़लाइन भी |
सर्वर कुकी (HttpOnly) | सर्वर | नहीं | सर्वर के माध्यम से | JS के लिए अदृश्य, फिर भी हर अनुरोध पर भेजी जाती है |
| ETag सुपरकुकी | सर्वर | नहीं | केवल कैश मिटाना | If-None-Match में आईडी गूंजित होती है |
| Last-Modified सुपरकुकी | सर्वर | नहीं | केवल कैश मिटाना | आईडी को कैश्ड संसाधन की तारीख में एन्कोड किया जाता है |
| HTTP कैश (embeded-id स्क्रिप्ट) | सर्वर | नहीं | केवल कैश मिटाना | आईडी को एक immutable कैश्ड फ़ाइल में पकाया जाता है |
इनके ऊपर, पृष्ठ ब्राउज़र से स्थायी भंडारण (navigator.storage.persist()) मांगता है, जो IndexedDB / Cache / Service Worker / OPFS प्रतियों को स्वचालित निष्कासन से छूट देता है — उन्हें हटाना और भी कठिन बना देता है।
तीन कैश-आधारित वेक्टर स्थायित्व का मुख्य बिंदु हैं: वे ब्राउज़र के HTTP कैश में रहते हैं, इसलिए जावास्क्रिप्ट (हमारा "मुझे भूल जाओ" सहित) उन्हें हटा नहीं सकता — केवल आपके ब्राउज़र कैश को साफ़ करने से होता है। इस तरह आईडी मृतकों में से वापस आती है।
कार्यान्वित भंडारण वेक्टरों का पूर्ण विवरण, साथ ही HSTS सुपरकुकी विचार जो अभी भी इस परियोजना में फिट बैठता है, 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
बैकएंड परीक्षण सर्वर-साइड वेक्टर और ऑब्ज़र्वेशन लॉग का परीक्षण करते हैं। ब्राउज़र व्यवहार के लिए अभी भी एक वास्तविक ब्राउज़र की आवश्यकता होती है क्योंकि कई वेक्टर ओरिजिन स्टोरेज, सर्विस वर्कर्स और HTTP कैशिंग पर निर्भर करते हैं।
यह एक रक्षात्मक / जागरूकता उपकरण है। डिज़ाइन में शामिल दिशानिर्देश:
कृपया किसी भी फोर्क को उसी भावना में रखें: इसका उपयोग लोगों को सिखाने के लिए करें कि ट्रैकिंग कैसे काम करती है ताकि वे अपनी रक्षा कर सकें, न कि उन्हें गुप्त रूप से ट्रैक करने के लिए।
MIT — देखें LICENSE।