ভূমিকা
আমি জানি না যে কেবল কোনও ব্রাউজার ব্যবহার করে মেশিনগুলি অনন্যভাবে চিহ্নিত করার উপায় আছে বা কখনও হবে। প্রধান কারণগুলি হ'ল:
- আপনার ব্যবহারকারীদের কম্পিউটারে ডেটা সংরক্ষণ করতে হবে। এই ডেটা ব্যবহারকারীর দ্বারা যে কোনও সময় মুছে ফেলা যায়। যদি না আপনার কাছে এই ডেটাটি পুনরায় তৈরি করার উপায় থাকে যা প্রতিটি মেশিনের জন্য অনন্য তবে আপনার আটকে।
- ভ্যালিডেশন। স্পোফিং, সেশন হাইজ্যাকিং ইত্যাদি থেকে আপনাকে রক্ষা করা উচিত need
এমনকি কুকি ব্যবহার না করে কোনও কম্পিউটারকে ট্র্যাক করার উপায় থাকলেও সর্বদা এটির বাইপাস করার একটি উপায় থাকবে এবং সফ্টওয়্যার যা এটি স্বয়ংক্রিয়ভাবে করবে। আপনার যদি কম্পিউটারের উপর ভিত্তি করে কিছু আবিষ্কার করতে হয় তবে আপনাকে একটি নেটিভ অ্যাপ্লিকেশন লিখতে হবে (অ্যাপল স্টোর / অ্যান্ড্রয়েড স্টোর / উইন্ডোজ প্রোগ্রাম / ইত্যাদি)।
আপনি যে প্রশ্নটি করেছিলেন সেটির উত্তর আমি দিতে সক্ষম নাও হতে পারছি তবে সেশন ট্র্যাকিং কীভাবে প্রয়োগ করা যায় তা আমি আপনাকে দেখাতে পারি। সেশন ট্র্যাকিংয়ের মাধ্যমে আপনি আপনার সাইটটিতে পরিদর্শন করা কম্পিউটারের পরিবর্তে ব্রাউজিং সেশনটি ট্র্যাক করার চেষ্টা করছেন। সেশনটি ট্র্যাক করে আপনার ডাটাবেস স্কিমাটি দেখতে পাবেন:
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 টি পৃথক সেশনের ফলস্বরূপ। এটি যদি সমস্যা হয় তবে আপনি এখানে পড়া বন্ধ করতে পারেন।
- ব্যবহারকারীর লগ ইন না থাকলে সেশনগুলির মেয়াদ শেষ হবে a
বাস্তবায়ন
এটি বাস্তবায়নের অনেকগুলি উপায় রয়েছে। আমি মনে করি না যে আমি তাদের সমস্তটি কভার করতে পারি আমি কেবল আমার প্রিয় তালিকা তৈরি করব যা এটির একটি মতামতযুক্ত উত্তর তৈরি করবে । মনে রাখবেন।
বুনিয়াদি
চিরকালীন কুকি হিসাবে পরিচিত যা ব্যবহার করে আমি সেশনটি ট্র্যাক করব। এটি এমন ডেটা যা ব্যবহারকারী তার কুকিগুলি মুছে ফেললে বা ব্রাউজার আপডেট করলেও স্বয়ংক্রিয়ভাবে নিজেকে পুনরায় তৈরি করবে। এটি ব্যবহারকারীকে তাদের কুকিজ এবং তাদের ব্রাউজিং ক্যাশে উভয়ই মুছে ফেললে টিকে থাকবে না।
এটি বাস্তবায়নের জন্য আমি ব্রাউজারগুলি ক্যাচিং মেকানিজম ( আরএফসি ), ওয়েবস্টোরেজ এপিআই ( এমডিএন ) এবং ব্রাউজার কুকিজ ( আরএফসি , গুগল অ্যানালিটিক্স ) ব্যবহার করব।
আইনগত
ট্র্যাকিং আইডিকে ব্যবহার করতে আপনাকে এগুলি আপনার গোপনীয়তা নীতি এবং আপনার ব্যবহারের শর্তগুলিতে উভয়ই সাব-শিরোনাম ট্র্যাকিংয়ের অধীনে যুক্ত করতে হবে । আমরা উভয় document.cookie
এবং নীচের কীগুলি ব্যবহার করব window.localStorage
:
- _ga : গুগল অ্যানালিটিক্স ডেটা
- __utma : গুগল অ্যানালিটিক্স ট্র্যাকিং কুকি
- sid : সেশনআইডি
নিশ্চিত হয়ে নিন যে আপনি আপনার গোপনীয়তা নীতি এবং লিংকগুলি ট্র্যাকিং ব্যবহার করে এমন সমস্ত পৃষ্ঠায় ব্যবহারের শর্তাদি অন্তর্ভুক্ত করেছেন।
আমি আমার সেশন ডেটা কোথায় সঞ্চয় করব?
আপনি আপনার ওয়েবসাইটের ডাটাবেসে বা ব্যবহারকারীদের কম্পিউটারে আপনার সেশন ডেটা সঞ্চয় করতে পারেন। যেহেতু আমি সাধারণত ছোট সাইটগুলিতে কাজ করি (10 হাজারের বেশি ধারাবাহিক সংযোগ দিন) যা তৃতীয় পক্ষের অ্যাপ্লিকেশন ব্যবহার করে (গুগল অ্যানালিটিক্স / ক্লিকি / ইত্যাদি) ক্লায়েন্টদের কম্পিউটারে ডেটা সঞ্চয় করা আমার পক্ষে সেরা। এর নিম্নলিখিত সুবিধা রয়েছে:
- কোনও ডাটাবেস অনুসন্ধান / ওভারহেড / লোড / বিলম্ব / স্থান / ইত্যাদি নেই
- ব্যবহারকারীরা যখনই আমাকে বিরক্তিকর ইমেলগুলি লেখার প্রয়োজন ছাড়াই তাদের ডেটা মুছতে পারে।
এবং অসুবিধা:
- ডেটা এনক্রিপ্ট / ডিক্রিপ্ট এবং স্বাক্ষরিত / যাচাই করতে হবে যা ক্লায়েন্টের উপর সিপিইউ ওভারহেড তৈরি করে (এত খারাপ নয়) এবং সার্ভার (বাহ!)।
- ব্যবহারকারী তাদের কুকি এবং ক্যাশে মুছে ফেললে ডেটা মুছে ফেলা হয়। (এটিই আমি সত্যই চাই)
- ব্যবহারকারীরা অফ-লাইন গেলে বিশ্লেষণের জন্য ডেটা অনুপলব্ধ থাকে। (বর্তমানে শুধুমাত্র ব্রাউজিং ব্যবহারকারীদের জন্য বিশ্লেষণ)
UUID জানা
- ব্রাউজারআইডি : ব্রাউজার ব্যবহারকারী এজেন্ট স্ট্রিং থেকে স্বতন্ত্র আইডি উত্পন্ন।
Browser|BrowserVersion|OS|OSVersion|Processor|MozzilaMajorVersion|GeckoMajorVersion
- কম্পিউটারআইডিআইডি : ব্যবহারকারীদের আইপি ঠিকানা এবং এইচটিটিপিএস সেশন কী থেকে উত্পন্ন।
getISP(requestIP)|getHTTPSClientKey()
- ফিঙ্গারপ্রিন্টআইডি : একটি পরিবর্তিত ফিঙ্গারপ্রিন্ট.জেএস এর উপর ভিত্তি করে জাভাস্ক্রিপ্ট ভিত্তিক ফিঙ্গারপ্রিন্ট ।
FingerPrint.get()
- সেশনআইডি : ব্যবহারকারী 1 ম সাইট দেখার সময় এলোমেলো কী উত্পন্ন হয়।
BrowserID|ComputerID|randombytes(256)
- গুগলআইডি :
__utma
কুকি থেকে উত্পন্ন ।getCookie(__utma).uniqueid
পদ্ধতি
অন্য দিন আমি আমার গার্লফ্রেন্ডের সাথে ভেন্ডি উইলিয়ামস শোটি দেখছিলাম এবং হোস্ট তার দর্শকদের মাসে একবার অন্তত একবার ব্রাউজারের ইতিহাস মুছতে পরামর্শ দেওয়ার সময় পুরোপুরি আতঙ্কিত হয়ে পড়েছিল। ব্রাউজারের ইতিহাস মুছতে সাধারণত নিম্নলিখিত প্রভাবগুলি থাকে:
- পরিদর্শন করা ওয়েবসাইটগুলির ইতিহাস মুছে দেয়।
- কুকিজ এবং
window.localStorage
(ওউ ম্যান) মুছে ফেলে ।
বেশিরভাগ আধুনিক ব্রাউজারগুলি এই বিকল্পটি সহজেই উপলভ্য করে তবে বন্ধুবান্ধবকে ভয় পান না। কারণ একটি সমাধান আছে। স্ক্রিপ্ট / চিত্র এবং অন্যান্য জিনিস সংরক্ষণ করার জন্য ব্রাউজারে একটি ক্যাশিং ব্যবস্থা রয়েছে। সাধারণত আমরা আমাদের ইতিহাস মুছলেও, এই ব্রাউজারের ক্যাশে এখনও রয়ে গেছে। আমাদের কেবল আমাদের ডেটা সংরক্ষণ করার একটি উপায়। এটি করার 2 টি পদ্ধতি রয়েছে। এসভিজি চিত্র ব্যবহার করা এবং আমাদের ডেটাগুলিকে তার ট্যাগগুলির মধ্যে সঞ্চয় করা আরও ভাল। জাভাস্ক্রিপ্ট ফ্ল্যাশ ব্যবহার করে অক্ষম করা থাকলেও এইভাবে ডেটা বের করা যেতে পারে। তবে এটি যেহেতু কিছুটা জটিল তাই আমি অন্য পদ্ধতির প্রদর্শন করব যা জেএসএনপি ( উইকিপিডিয়া ) ব্যবহার করে
উদাহরণ.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") || ""
আমি কীভাবে ব্রাউজারে ট্র্যাকিং.জেএস স্টিক করব?
আমরা এটি ক্যাশে-নিয়ন্ত্রণ , সর্বশেষ-সংশোধিত এবং ইটাগ এইচটিটিপি শিরোনাম ব্যবহার করে অর্জন করতে পারি । আমরা SessionID
ইটাগ শিরোলেখের জন্য মানটি ব্যবহার করতে পারি :
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
প্রতিক্রিয়া গ্রহণ করে যার ফলে এটি এর প্রথম সংস্করণটি tracking.js
পুনরুদ্ধার করে। tracking.js
কার্যকর করে এবং পুনরুদ্ধার SessionID
যে মুছে ফেলা হয়েছে।
ভ্যালিডেশন
ধরা যাক হ্যাক্সার এক্স আমাদের গ্রাহকদের কুকিগুলি এখনও লগ ইন করার সময় চুরি করে ফেলেছে we আমরা কীভাবে সেগুলি রক্ষা করব? ক্রিপ্টোগ্রাফি এবং ব্রাউজারটি উদ্ধারে উদ্ধার করছে। আমাদের মূল সংজ্ঞাটি মনে রাখবেন 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
। তার মানে তাদের শিকার (ট্রিকি) হিসাবে একই আইএসপি সরবরাহকারী থাকতে হবে। এটি আমাদের ক্ষতিগ্রস্থকে তাদের দেশে আইনী পদক্ষেপ গ্রহণের সুযোগ দেবে। হ্যাক্সর অবশ্যই শিকার (হার্ড) এর কাছ থেকে এইচটিটিপিএস সেশন কী অর্জন করতে হবে।
- একই আছে
BrowserID
। যে কেউ ইউজার-এজেন্ট স্ট্রিং (বিরক্তিকর) কে ফাঁকি দিতে পারে।
- তাদের নিজস্ব জাল তৈরি করতে সক্ষম হবেন
SessionID
(খুব হার্ড)। ভলিউম অ্যাটাকগুলি কাজ করবে না কারণ আমরা এনক্রিপশন / সাইন ইন কী উত্পন্ন করতে টাইম স্ট্যাম্প ব্যবহার করি যা মূলত এটি প্রতিটি সেশনের জন্য একটি নতুন কী উত্পন্ন করার মতো। তার উপরে আমরা এলোমেলো বাইটগুলি এনক্রিপ্ট করেছি যাতে একটি সাধারণ অভিধান আক্রমণটিও প্রশ্নের বাইরে of
আমরা ফরওয়ার্ড করে GoogleID
এবং FingerprintID
(এজ্যাক্স বা লুকানো ক্ষেত্রের মাধ্যমে) এবং সেগুলির বিরুদ্ধে মিলে বৈধতা উন্নত করতে পারি ।
if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;