परिचय
मुझे नहीं पता कि क्या है या कभी भी अकेले ब्राउज़र का उपयोग करके विशिष्ट रूप से मशीनों की पहचान करने का एक तरीका होगा। मुख्य कारण हैं:
- आपको उपयोगकर्ता कंप्यूटर पर डेटा सहेजने की आवश्यकता होगी। यह डेटा किसी भी समय उपयोगकर्ता द्वारा हटाया जा सकता है। जब तक आपके पास इस डेटा को फिर से बनाने का कोई तरीका नहीं है जो प्रत्येक मशीन के लिए अद्वितीय है और फिर आपका अटक गया है।
- मान्यकरण। आपको स्पूफिंग, सेशन हाईजैकिंग आदि से बचाव करने की आवश्यकता है।
यहां तक कि अगर कुकीज़ का उपयोग किए बिना कंप्यूटर को ट्रैक करने के तरीके हैं, तो हमेशा इसे बायपास करने का एक तरीका होगा और सॉफ्टवेयर जो स्वचालित रूप से ऐसा करेगा। यदि आपको वास्तव में कंप्यूटर के आधार पर कुछ ट्रैक करने की आवश्यकता है, तो आपको एक मूल एप्लिकेशन (ऐप्पल स्टोर / एंड्रॉइड स्टोर / विंडोज प्रोग्राम / आदि) लिखना होगा।
मैं आपके द्वारा पूछे गए प्रश्न का उत्तर देने में सक्षम नहीं हो सकता, लेकिन मैं आपको दिखा सकता हूं कि सत्र ट्रैकिंग को कैसे लागू किया जाए। सत्र ट्रैकिंग के साथ आप अपनी साइट पर आने वाले कंप्यूटर के बजाय ब्राउज़िंग सत्र को ट्रैक करने का प्रयास करते हैं। सत्र पर नज़र रखने से, आपका डेटाबेस स्कीमा इस तरह दिखेगा:
sesssion:
sessionID: string
// Global session data goes here
computers: [{
BrowserID: string
ComputerID: string
FingerprintID: string
userID: string
authToken: string
ipAddresses: ["203.525....", "203.525...", ...]
// Computer session data goes here
}, ...]
सत्र आधारित ट्रैकिंग के लाभ:
- लॉग इन उपयोगकर्ताओं के लिए, आप हमेशा उपयोगकर्ताओं
username
/ password
/ से एक ही सत्र आईडी उत्पन्न कर सकते हैं email
।
- आप अभी भी उपयोग करने वाले अतिथि उपयोगकर्ताओं को ट्रैक कर सकते हैं
sessionID
।
- यहां तक कि अगर कई लोग एक ही कंप्यूटर (यानी साइबर कैफे) का उपयोग करते हैं, तो आप उन्हें लॉग इन करने पर अलग से ट्रैक कर सकते हैं।
सत्र आधारित ट्रैकिंग के नुकसान:
- सत्र ब्राउज़र आधारित हैं और कंप्यूटर आधारित नहीं हैं। यदि कोई उपयोगकर्ता 2 अलग-अलग ब्राउज़रों का उपयोग करता है, तो इसके परिणामस्वरूप 2 अलग-अलग सत्र होंगे। यदि यह एक समस्या है तो आप यहां पढ़ना बंद कर सकते हैं।
- यदि उपयोगकर्ता लॉग इन नहीं है, तो सत्र समाप्त हो जाता है। यदि कोई उपयोगकर्ता लॉग इन नहीं है, तो वे एक अतिथि सत्र का उपयोग करेंगे, जिसे अमान्य कर दिया जाएगा यदि उपयोगकर्ता कुकीज़ और ब्राउज़र कैश हटाता है।
कार्यान्वयन
इसे लागू करने के कई तरीके हैं। मुझे नहीं लगता कि मैं उन सभी को कवर कर सकता हूं, मैं सिर्फ अपने पसंदीदा को सूचीबद्ध करूंगा जो इसे एक राय बना देगा । मन में है कि सहन करो।
मूल बातें
मैं हमेशा के लिए कुकी के रूप में जाना जाता है का उपयोग करके सत्र को ट्रैक करूंगा। यह वह डेटा है जो उपयोगकर्ता द्वारा अपने कुकीज़ को हटाने या अपने ब्राउज़र को अपडेट करने पर भी स्वचालित रूप से फिर से बनाएगा। हालाँकि यह उनके कुकी और ब्राउजिंग कैश दोनों को डिलीट करने वाले यूजर से बचेगा नहीं।
इसे लागू करने के लिए मैं ब्राउज़र कैशिंग मैकेनिज्म ( RFC ), WebStorage API ( MDN ) और ब्राउज़र कुकीज़ ( RFC , Google Analytics ) का उपयोग करेगा।
कानूनी
ट्रैकिंग आईडी का उपयोग करने के लिए आपको उन्हें अपनी गोपनीयता नीति और उप-शीर्षक ट्रैकिंग के तहत अधिमानतः उपयोग की अपनी शर्तों को जोड़ना होगा । हम दोनों पर निम्नलिखित कुंजियों का उपयोग करेंगे document.cookie
और window.localStorage
:
- _ga : Google Analytics डेटा
- __utma : Google Analytics ट्रैकिंग कुकी
- सिड : सत्र
सुनिश्चित करें कि आप अपनी गोपनीयता नीति के लिंक और ट्रैकिंग का उपयोग करने वाले सभी पृष्ठों पर उपयोग की शर्तें शामिल हैं।
मैं अपना सत्र डेटा कहां संग्रहीत करूं?
आप या तो अपने सत्र डेटा को अपने वेबसाइट डेटाबेस में या उपयोगकर्ताओं के कंप्यूटर पर संग्रहीत कर सकते हैं। चूंकि मैं सामान्य रूप से छोटी साइटों (10 हजार से अधिक निरंतर कनेक्शन) पर काम करता हूं, जो कि 3 पार्टी एप्लिकेशन (Google Analytics / Clicky / etc) का उपयोग करते हैं, यह मेरे लिए क्लाइंट कंप्यूटर पर डेटा संग्रहीत करने के लिए सबसे अच्छा है। इसके निम्नलिखित फायदे हैं:
- कोई डेटाबेस देखने / ओवरहेड / लोड / विलंबता / अंतरिक्ष / आदि
- उपयोगकर्ता जब भी मुझे कष्टप्रद ईमेल लिखने की आवश्यकता के बिना अपना डेटा हटा सकते हैं।
और नुकसान:
- डेटा को एन्क्रिप्ट / डिक्रिप्ट और हस्ताक्षरित / सत्यापित करना होगा जो क्लाइंट पर सीपीयू ओवरहेड बनाता है (इतना बुरा नहीं) और सर्वर (बीएएच!)।
- जब उपयोगकर्ता अपनी कुकी और कैश हटाता है तो डेटा हटा दिया जाता है। (यह वही है जो मैं वास्तव में चाहता हूं)
- जब उपयोगकर्ता ऑफ-लाइन जाते हैं, तो डेटा एनालिटिक्स के लिए उपलब्ध नहीं है। (वर्तमान में केवल उपयोगकर्ताओं को ब्राउज़ करने के लिए विश्लेषण)
UUIDs
- BrowserID : ब्राउज़र उपयोगकर्ता एजेंट स्ट्रिंग से उत्पन्न अद्वितीय आईडी।
Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
- ComputerID : उपयोगकर्ताओं से उत्पन्न IP पता और HTTPS सत्र कुंजी।
getISP(requestIP)|getHTTPSClientKey()
- FingerPrintID : एक संशोधित आधार पर जावास्क्रिप्ट आधारित फिंगरप्रिंटिंग fingerprint.js ।
FingerPrint.get()
- SessionID : उपयोगकर्ता द्वारा पहली बार विज़िट किए जाने पर यादृच्छिक कुंजी उत्पन्न होती है।
BrowserID|ComputerID|randombytes(256)
- GoogleID :
__utma
कुकी से उत्पन्न ।getCookie(__utma).uniqueid
तंत्र
दूसरे दिन मैं अपनी प्रेमिका के साथ वेंडी विलियम्स शो देख रहा था और पूरी तरह से भयभीत था जब मेजबान ने अपने दर्शकों को महीने में कम से कम एक बार अपने ब्राउज़र के इतिहास को हटाने की सलाह दी। ब्राउज़र इतिहास को सामान्य रूप से हटाने के निम्नलिखित प्रभाव होते हैं:
- विज़िट की गई वेबसाइटों का इतिहास हटाता है।
- कुकीज़ और
window.localStorage
(aww आदमी) हटाता है ।
अधिकांश आधुनिक ब्राउज़र इस विकल्प को आसानी से उपलब्ध कराते हैं लेकिन दोस्तों से डरते नहीं हैं। के लिए एक समाधान है। ब्राउज़र में स्क्रिप्ट / चित्र और अन्य चीजों को संग्रहीत करने के लिए एक कैशिंग तंत्र है। आमतौर पर भले ही हम अपना इतिहास मिटा दें, फिर भी यह ब्राउज़र कैश रहता है। बस हमें अपने डेटा को यहां संग्रहीत करने का एक तरीका है। इसे करने के 2 तरीके हैं। बेहतर यह है कि एसवीजी छवि का उपयोग करें और इसके टैग के अंदर हमारे डेटा को संग्रहीत करें। इस तरह से डेटा अभी भी निकाला जा सकता है भले ही जावास्क्रिप्ट फ्लैश का उपयोग करके अक्षम हो। हालाँकि, यह थोड़ा जटिल है, मैं JSONP ( विकिपीडिया ) का उपयोग करने वाले अन्य दृष्टिकोण का प्रदर्शन करूँगा
example.com/assets/js/tracking.js (वास्तव में ट्रैकिंग। पीपी )
var now = new Date();
var window.__sid = "SessionID"; // Server generated
setCookie("sid", window.__sid, now.setFullYear(now.getFullYear() + 1, now.getMonth(), now.getDate() - 1));
if( "localStorage" in window ) {
window.localStorage.setItem("sid", window.__sid);
}
अब हम किसी भी समय अपना सत्र कुंजी प्राप्त कर सकते हैं:
window.__sid || window.localStorage.getItem("sid") || getCookie("sid") || ""
मैं ब्राउजर में ट्रैकिंग। जेएस स्टिक कैसे बनाऊं?
हम इसे Cache-Control , Last-Modified और ETag HTTP हेडर का उपयोग करके प्राप्त कर सकते हैं। हम SessionID
etag हेडर के लिए मान का उपयोग कर सकते हैं :
setHeaders({
"ETag": SessionID,
"Last-Modified": new Date(0).toUTCString(),
"Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})
Last-Modified
हेडर ब्राउज़र को बताता है कि यह फ़ाइल मूल रूप से कभी भी संशोधित नहीं हुई है। Cache-Control
प्रॉक्सी और गेटवे को दस्तावेज़ को कैश नहीं करने के लिए कहता है लेकिन ब्राउज़र को 1 साल के लिए इसे कैश करने के लिए कहता है।
अगली बार जब ब्राउज़र दस्तावेज़ का अनुरोध करता है, तो यह भेजेगा If-Modified-Since
और If-None-Match
हेडर देगा। हम एक 304 Not Modified
प्रतिक्रिया वापस करने के लिए इनका उपयोग कर सकते हैं ।
example.com/assets/js/tracking.php
$sid = getHeader("If-None-Match") ?: getHeader("if-none-match") ?: getHeader("IF-NONE-MATCH") ?: "";
$ifModifiedSince = hasHeader("If-Modified-Since") ?: hasHeader("if-modified-since") ?: hasHeader("IF-MODIFIED-SINCE");
if( validateSession($sid) ) {
if( sessionExists($sid) ) {
continueSession($sid);
send304();
} else {
startSession($sid);
send304();
}
} else if( $ifModifiedSince ) {
send304();
} else {
startSession();
send200();
}
अब हर बार जब ब्राउज़र अनुरोध करता है कि tracking.js
हमारा सर्वर 304 Not Modified
परिणाम के साथ प्रतिक्रिया देगा और स्थानीय प्रतिलिपि के निष्पादन को बाध्य करेगा tracking.js
।
मुझे अभी भी समझ नहीं आया। मुझे यह स्पष्ट करें
मान लीजिए कि उपयोगकर्ता अपने ब्राउज़िंग इतिहास को साफ़ करता है और पृष्ठ को ताज़ा करता है। उपयोगकर्ताओं के कंप्यूटर पर केवल एक चीज बची है जो tracking.js
ब्राउज़र कैश की एक प्रति है। जब ब्राउज़र अनुरोध करता है, तो tracking.js
यह एक 304 Not Modified
प्रतिक्रिया को पुन: प्राप्त करता है जिसके कारण यह इसके 1 संस्करण को निष्पादित करता है tracking.js
। tracking.js
निष्पादित और पुनर्स्थापित करता है SessionID
जो हटा दिया गया था।
मान्यकरण
मान लीजिए कि Haxor X ने हमारे ग्राहकों की कुकीज़ चुरा ली हैं, जबकि वे अभी भी लॉग इन हैं। हम उनकी सुरक्षा कैसे करते हैं? क्रिप्टोग्राफी और ब्राउज़र बचाव के लिए फिंगरप्रिंटिंग। इसके लिए हमारी मूल परिभाषा याद रखें SessionID
:
BrowserID|ComputerID|randomBytes(256)
हम इसे बदल सकते हैं:
Timestamp|BrowserID|ComputerID|encrypt(randomBytes(256), hk)|sign(Timestamp|BrowserID|ComputerID|randomBytes(256), hk)
कहाँ hk = sign(Timestamp|BrowserID|ComputerID, serverKey)
?
अब हम SessionID
निम्नलिखित एल्गोरिथ्म का उपयोग करके अपने को मान्य कर सकते हैं :
if( getTimestamp($sid) is older than 1 year ) return false;
if( getBrowserID($sid) !== createBrowserID($_Request, $_Server) ) return false;
if( getComputerID($sid) !== createComputerID($_Request, $_Server) return false;
$hk = sign(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid), $SERVER["key"]);
if( !verify(getTimestamp($sid) + getBrowserID($sid) + getComputerID($sid) + decrypt(getRandomBytes($sid), hk), getSignature($sid), $hk) ) return false;
return true;
अब काम करने के लिए हैक्सोर के हमले के क्रम में:
- एक ही है
ComputerID
। इसका मतलब है कि उन्हें पीड़ित (मुश्किल) के समान आईएसपी प्रदाता होना चाहिए। यह हमारे पीड़ित को अपने देश में कानूनी कार्रवाई करने का अवसर देगा। Haxor को पीड़ित (हार्ड) से HTTPS सत्र कुंजी भी प्राप्त करनी चाहिए।
- एक ही है
BrowserID
। कोई भी उपयोगकर्ता-एजेंट स्ट्रिंग (कष्टप्रद) को खराब कर सकता है।
- अपने स्वयं के नकली
SessionID
(बहुत कठिन) बनाने में सक्षम हो । वॉल्यूम एटैक्स काम नहीं करेगा क्योंकि हम एन्क्रिप्शन / हस्ताक्षर कुंजी बनाने के लिए एक टाइम-स्टैंप का उपयोग करते हैं, इसलिए मूल रूप से प्रत्येक सत्र के लिए एक नई कुंजी उत्पन्न करना पसंद करता है। शीर्ष पर हम यादृच्छिक बाइट्स को एन्क्रिप्ट करते हैं इसलिए एक सरल शब्दकोश हमला भी सवाल से बाहर है।
हम अग्रेषण GoogleID
और FingerprintID
(अजाक्स या छिपे हुए क्षेत्रों के माध्यम से) और उन लोगों के खिलाफ मिलान करके सत्यापन में सुधार कर सकते हैं।
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;