یکی از سؤالاتی که خیلی زیاد توی انجمنها برنامه نویسی وب بهش بر خوردم و بار ها جواب تکراری دادم در مورد شناسایی کاربران سایت به صورت یکتا برای مثلاً جلوگیری از ساخت چندین نام کاربری در سایت یا کلاً ردیابی کاربرانی که از سایت استفاده میکنند و دیگر نیاز هایی که حول شناسایی کاربر میگرده هست.
در یک پاسخ جامع و کلی باید بگم جز یک راه حل خاص که در ادامه بهش اشاره میکنم هیچ راه حلی برای شناسایی کاربر به صورت قطعی و دقیق چه در یک مرورگر و چه در هر مرورگری که کاربر استفاده کنه (به صورت System Wide یا سراسری) وجود نداره.
خیلی از این دوستان به دنبال Mac Address کارت شبکه کاربر یا شماره سریال هارد کاربر هستند که یکتا باشه و بشه از طریق اون ها کاربر را شناسایی کرد. در پاسخ به این دوستان باید گفت که از سمت Client که جاوا اسکریپت را در اختیار داریم امکان هیچ دسترسی به فایل سیستم یا اطلاعات سخت افزاری کاربر وجود نداره مگه اینکه کاربر را مجاب به نصب Com Object یا Java Applet کنیم که با توجه به ریسک های امنیتی که این دو مورد دارند بالای ۹۹ درصد کاربران آنها را نصب نخواهند کرد. در واقع شاید با نصب نرمافزار ، گواهی دیجیتال یا افزونه مرورگر بشه کاربر را شناسایی کرد ولی به صورت مطلق و استفاده در پروژه های عمومی وب امکانپذیر نیست.
کلاً اطلاعاتی که از طرف کاربر در اختیار ما قرار میگیره یا مثل IP قابل تغییر هست یا مثل کوکی ، E-Tag ، Flash Cookie و … میتونه توسط کاربر حذف بشه. اما اگه هیچ راه حلی وجود نداشت پس نرمافزار هایی که برای امور تبلیغاتی کاربرها را ردیابی میکنند از چه تکنیکی استفاده میکنند؟
در پاسخ باید گفت این نرمافزار ها معمولاً با جمع آوری اطلاعات مختلف از مرورگر ، پلاگین های نصب شده ،فونت های نصب شده و غیره به همراه متد های آماری مانند Bayesian Inference و الگوریتم ها و متد های پیچیده دیگر به شناسایی و ردیابی کاربران می پردازند.
شاید تا الان کلاً قید ردیابی و شناسایی کاربر را زده باشید اما یک راه حل نسبتاً خوب با توجه به امکانات جدید HTML5 از جمله Canvas به نام Browser Fingerprinting یا انگشت نگاری مرورگر وجود داره که دقیقاً بر اساس گرداوری اطلاعات مختلف مرورگر و سیستم کاربر (موارد قابل دسترسی مانند رزولوشن مانیتور و …) یک رشته هش تولید میکنه که تا ۹۴٪ موارد یکتا هست.
یکی از کتابخانههای جاوا اسکریپتی که میتونم معرفی کنم fingerprintjs هست که کار باهاش خیلی ساده و در یک سطر قابل انجامه :
var fingerprint = new Fingerprint({canvas: true, screen_resolution: true}).get();
مطلب بسیار مفیدی بود .
مرسی خوب بود