javascript - Web sitemi ziyaret eden bilgisayarları nasıl benzersiz bir şekilde tanımlayabilirim?


Oluşturduğum web sitesini ziyaret eden her bilgisayarı benzersiz bir şekilde tanımlamanın bir yolunu bulmam gerekiyor. Bunu başarmak için herhangi bir tavsiyesi olan var mı?

Çünkü çözümün tüm makinelerde ve tüm tarayıcılarda (makul sınırlar içinde) çalışmasını istiyorum, bu yüzden javascript kullanarak bir çözüm oluşturmaya çalışıyorum.

Kurabiyeler işe yaramaz.

Temelde, bilgisayara özel ve tekrarlanabilir bir GUID oluşturma yeteneğine ihtiyacım var, bilgisayarda herhangi bir donanım değişikliği olmamış varsayılırsa. Düşündüğüm yönler, ağ kartının MAC adresini ve bu tür diğer bilgileri alarak web sitesini ziyaret eden makineyi tanımlamak.

Cevap #1

Giriş

Sadece bir tarayıcı kullanarak makineleri benzersiz şekilde tanımlamanın bir yolu olup olmadığını ya da olup olmayacağını bilmiyorum. Başlıca nedenler şunlardır:

  • Verileri kullanıcının bilgisayarında kaydetmeniz gerekecek. Bu veriler kullanıcı tarafından her zaman silinebilir. Eğer her bir makine için benzersiz olan bu verileri yeniden oluşturmanın bir yoluna sahip değilseniz, o zaman sıkışmışsınız demektir.
  • Doğrulama. Sahtekarlık, oturum kaçırma vb. durumlara karşı önlem almanız gerekir.

Bilgisayarı çerez kullanmadan takip etmenin yolları olsa bile, her zaman bunu atlatmanın bir yolu ve bunu otomatik olarak yapan yazılım olacaktır. Bir bilgisayara dayalı olarak bir şeyi gerçekten takip etmeniz gerekiyorsa, bir yerel uygulama yazmanız gerekecektir (Apple Store/Android Store/Windows Program/vb).

Sorduğunuz soruya bir cevap veremeyebilirim ama size oturum takibini nasıl uygulayacağınızı gösterebilirim. Oturum takibi ile, sitenizi ziyaret eden bilgisayar yerine gezinme oturumunu takip etmeye çalışırsınız. Oturumu takip ederek, veritabanı şemanız şöyle görünecektir:

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
  }, ...]

Oturum tabanlı takip avantajları:

  1. Giriş yapmış kullanıcılar için, kullanıcıların kullanıcı adı/şifre/e-posta bilgilerini kullanarak her zaman aynı oturum kimliğini oluşturabilirsiniz.
  2. Hâlâ sessionID kullanarak misafir kullanıcıları takip edebilirsiniz.
  3. Aynı bilgisayarı (örneğin internet kafeyi) birkaç kişi kullanıyor olsa bile, giriş yaparlarsa onları ayrı ayrı takip edebilirsiniz.

Oturum tabanlı izleme dezavantajları:

  1. Oturumlar tarayıcı tabanlıdır ve bilgisayar tabanlı değildir. Bir kullanıcı iki farklı tarayıcı kullanırsa bu, iki farklı oturumla sonuçlanacaktır. Eğer bu bir sorun ise, burada okumayı bırakabilirsiniz.
  2. Kullanıcı giriş yapmadıysa oturumlar süresi dolar. Kullanıcı giriş yapmazsa, çerezleri ve tarayıcı önbelleğini silmesi durumunda geçersiz hale gelecek bir misafir oturumu kullanacaktır.

Uygulama

Bunu uygulamanın birçok yolu var. Hepsini kapsayabileceğimi sanmıyorum, sadece en sevdiğimi listeleyeceğim, bu da bunu görüş odaklı bir cevap yapar. Bunu aklınızda bulundurun.

Temel

Oturumu, sonsuz çerez olarak bilinen şeyi kullanarak takip edeceğim. Bu, kullanıcı çerezlerini silse veya tarayıcısını güncellese bile otomatik olarak kendini yeniden oluşturacak veridir. Ancak, kullanıcı hem çerezlerini hem de tarama önbelleğini silerse hayatta kalmayacaktır.

Bunu uygulamak için tarayıcıların önbellekleme mekanizmasını (RFC), WebStorage API'sini (MDN) ve tarayıcı çerezlerini (RFC, Google Analytics) kullanacağım.

Yasal

Takip kimliklerini kullanabilmek için, bunları gizlilik politikanıza ve kullanım şartlarınıza, tercihen Takip alt başlığı altında eklemeniz gerekir. Aşağıdaki anahtarları hem document.cookie hem de window.localStorage üzerinde kullanacağız:

  • _ga: Google Analytics verileri
  • __utma: Google Analytics izleme çerezi
  • sid: OturumID

Takip kullanan tüm sayfalarda Gizlilik Politikası ve kullanım şartlarınıza bağlantılar eklediğinizden emin olun.

Oturum verilerimi nerede saklıyorum?

Oturum verilerinizi ya web sitenizin veritabanında ya da kullanıcıların bilgisayarında saklayabilirsiniz. Normalde 3. taraf uygulamalar (Google Analytics/Clicky/vb.) kullanan daha küçük sitelerde çalıştığım için (10 binden az sürekli bağlantı) verileri müşteri bilgisayarında saklamak benim için en iyisidir. Bunun aşağıdaki avantajları vardır:

  1. Veritabanı sorgulaması/ek yük/yük/gecikme/alan/vb. yok.
  2. Kullanıcı, canını sıkan e-postalar yazmak zorunda kalmadan verilerini istedikleri zaman silebilir.

ve dezavantajlar:

  1. Verilerin şifrelenmesi/şifresinin çözülmesi ve imzalanması/doğrulanması gerekiyor, bu da istemci üzerinde (o kadar kötü değil) ve sunucu üzerinde (vah!) CPU yükü yaratıyor.
  2. Veriler, kullanıcı çerezlerini ve önbelleğini sildiğinde silinir. (aslında istediğim bu)
  3. Kullanıcılar çevrimdışıyken analiz için veri kullanılamaz. (sadece şu anda tarayan kullanıcılar için analiz)

UUID'ler

  • BrowserID: Tarayıcının kullanıcı aracısı (user agent) dizgisinden oluşturulan benzersiz kimlik. Tarayıcı|TarayıcıVersiyonu|İşletimSistemi|İşletimSistemiVersiyonu|İşlemci|MozillaAnaVersiyonu|GeckoAnaVersiyonu
  • ComputerID: Kullanıcının IP Adresi ve HTTPS oturum anahtarından oluşturulmuştur. getISP(requestIP)|getHTTPSClientKey()
  • FingerPrintID: Değiştirilmiş fingerprint.js üzerine kurulu JavaScript tabanlı parmak izi tanımlama. FingerPrint.get()
  • SessionID: Kullanıcı siteyi ilk ziyaret ettiğinde oluşturulan rastgele anahtar. BrowserID|ComputerID|randombytes(256)
  • GoogleID: __utma çerezinden türetilmiştir. getCookie(__utma).uniqueid

Mekanizma

Geçen gün kız arkadaşımla Wendy Williams şovunu izliyordum ve sunucunun izleyicilerine tarayıcı geçmişlerini en az ayda bir silmelerini tavsiye ettiğinde tamamen dehşete düştüm. Tarayıcı geçmişini silmek normalde şu etkileri yapar:

  1. Ziyaret edilen web sitelerinin geçmişini siler.
  2. Çerezleri ve window.localStorage'ı siler (ah canım).

Çoğu modern tarayıcı bu seçeneği kolayca sunar, ama korkmayın arkadaşlar. Çünkü bir çözüm var. Tarayıcının, script’leri/resimleri ve diğer şeyleri depolamak için bir önbellek mekanizması vardır. Genellikle tarihçemizi silsek bile, bu tarayıcı önbelleği hala kalır. Yapmamız gereken tek şey verilerimizi burada depolayacak bir yol bulmaktır. Bunu yapmanın 2 yöntemi vardır. Daha iyi olanı bir SVG resmi kullanmak ve verilerimizi etiketlerinin içine yerleştirmektir. Bu sayede JavaScript devre dışı bırakılmış olsa bile veriler flash kullanılarak çıkarılabilir. Ancak bu biraz komplike olduğu için JSONP (Wikipedia) kullanan diğer yaklaşımı göstereceğim.

example.com/assets/js/tracking.js (aslında tracking.php)

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);
}

Artık oturum anahtarımızı istediğimiz zaman alabiliriz:

window.__sid || window.localStorage.getItem("sid") || getCookie("sid") || ""

tracking.js'i tarayıcıda nasıl sabitlerim?

Bunu Cache-Control, Last-Modified ve ETag HTTP başlıklarını kullanarak başarabiliriz. ETag başlığı için değer olarak SessionID'yi kullanabiliriz:

setHeaders({
  "ETag": SessionID,
  "Last-Modified": new Date(0).toUTCString(),
  "Cache-Control": "private, max-age=31536000, s-max-age=31536000, must-revalidate"
})

Last-Modified başlığı, tarayıcıya bu dosyanın neredeyse hiç değiştirilmediğini söyler. Cache-Control başlığı, proxy'lere ve geçitlere dokümanı önbelleğe almamalarını söyler ama tarayıcıya onu 1 yıl boyunca önbelleğe almasını söyler.

Tarayıcı belgeleri bir sonraki kez talep ettiğinde, If-Modified-Since ve If-None-Match başlıklarını gönderecektir. Bunları 304 Not Modified yanıtını döndürmek için kullanabiliriz.

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();
}

Şimdi tarayıcı her tracking.js dosyasını talep ettiğinde, sunucumuz 304 Not Modified sonucu ile cevap verecek ve tracking.js dosyasının yerel kopyasının çalıştırılmasını zorlayacaktır.

Hâlâ anlamıyorum. Bana bunu açıklayın

Kullanıcının tarama geçmişini sildiğini ve sayfayı yenilediğini varsayalım. Kullanıcının bilgisayarında geriye kalan tek şey tarayıcı önbelleğinde bir tracking.js kopyasıdır. Tarayıcı tracking.js isteğinde bulunduğunda 304 Not Modified yanıtı alır ve bu da tarayıcının aldığı 1. sürüm tracking.js'i çalıştırmasına neden olur. tracking.js çalışır ve silinen SessionID'yi geri yükler.

Doğrulama

Diyelim ki Haxor X, müşterilerimiz giriş yapmışken onların çerezlerini çalıyor. Onları nasıl koruruz? Kriptografi ve Tarayıcı parmak izi yardıma koşuyor. SessionID için orijinal tanımımızı hatırlayın:

BrowserID|ComputerID|randomBytes(256)

Bunu şu şekilde değiştirebiliriz:

Timestamp|BrowserID|ComputerID|encrypt(randomBytes(256), hk)|sign(Timestamp|BrowserID|ComputerID|randomBytes(256), hk)

Burada hk=sign(Timestamp|BrowserID|ComputerID, serverKey).

Artık SessionID değerimizi aşağıdaki algoritmayı kullanarak doğrulayabiliriz:

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; 

Şimdi Haxor'ın saldırısının işe yaraması için onların şunları yapması gerekir:

  1. Aynı ComputerID'ye sahipim. Bu, mağdurla aynı ISP sağlayıcısına sahip olmaları gerektiği anlamına geliyor (Tricky). Bu, mağdurumuzun kendi ülkesinde yasal işlem yapma fırsatı verecektir. Haxor ayrıca kurbandan (Zor) HTTPS oturum anahtarını almalıdır.
  2. Aynı BrowserID'ye sahip. Herkes User-Agent dizesini taklit edebilir (Sinir bozucu).
  3. Kendi sahte SessionID’lerini oluşturabilmek (Çok Zor). Hacim saldırıları işe yaramaz çünkü şifreleme/imzalama anahtarını oluşturmak için zaman damgası kullanıyoruz, yani temelde her oturum için yeni bir anahtar oluşturmak gibi. Bunun üzerine rastgele baytları şifreliyoruz, bu nedenle basit bir sözlük saldırısı da söz konusu değil.

Doğrulamayı, GoogleID ve FingerprintID'yi (ajax veya gizli alanlar aracılığıyla) ileterek ve bunlarla eşleştirerek geliştirebiliriz.

if( GoogleID != getStoredGoodleID($sid) ) return false;
if( byte_difference(FingerPrintID, getStoredFingerprint($sid) > 10%) return false;

Cevap #2

Bu insanlar, kullanıcıyı yüksek doğruluk seviyesinde tanımak için bir parmak izi yöntemi geliştirdiler:

https://panopticlick.eff.org/static/browser-uniqueness.pdf

Modern web tarayıcılarının, istek üzerine web sitelerine iletecekleri sürüm ve yapılandırma bilgileri aracılığıyla “cihaz parmak izi” almaya ne ölçüde maruz kaldığını araştırıyoruz. Olası bir parmak izi algoritması uyguladık ve bu parmak izlerini test sitemiz panopticlick.eff.org’u ziyaret eden geniş bir tarayıcı örnekleminden topladık. Parmak izlerimizin dağılımının en az 18,1 bit entropi içerdiğini gözlemledik, bu da rastgele bir tarayıcı seçersek en iyi ihtimalle 286.777 diğer tarayıcıdan yalnızca birinin onun parmak izi ile aynı olmasını bekleyebileceğimiz anlamına gelir. Flash veya Java destekleyen tarayıcılar arasında durum daha da kötü, ortalama bir tarayıcı en az 18,8 bit tanımlayıcı bilgi taşıyor. Örneklemimizde Flash veya Java’ya sahip tarayıcıların %94,2’si benzersizdi.

Geri dönen ziyaretçileri gözlemleyerek, tarayıcı parmak izlerinin zaman içinde ne kadar hızlı değişebileceğini tahmin ediyoruz. Örneklemimizde, parmak izleri oldukça hızlı değişti, ancak basit bir sezgisel yöntem bile genellikle bir parmak izinin daha önce gözlemlenen bir tarayıcının parmak izinin 'geliştirilmiş' bir versiyonu olup olmadığını tahmin edebiliyordu; tahminlerin %99,1'i doğruydu ve yanlış pozitif oranı yalnızca %0,86 idi.

Tarayıcı parmak izi almanın pratikte ne tür bir gizlilik tehdidi oluşturduğunu ve bunu önlemek için hangi önlemlerin uygun olabileceğini tartışıyoruz. Parmak izi alınabilirliğe karşı koruma ile belirli türde hata ayıklanabilirlik arasında bir ödünleşme vardır ve mevcut tarayıcılarda bu, gizlilik aleyhine ağır bastır. Paradoksal bir şekilde, anti-parmak izi gizlilik teknolojileri yeterli sayıda insan tarafından kullanılmazsa kendini boşa çıkarabilir; bazı gizlilik önlemlerinin şu anda bu paradokstan etkilendiğini, bazılarının ise etkilenmediğini gösteriyoruz.

Cevap #3

Bir web sitesine erişen bilgisayarları, sahiplerinin iş birliği olmadan tanımlamak mümkün değildir. Ancak izin verirlerse, sitenizi tekrar ziyaret ettiklerinde makineyi tanımlamak için bir çerez saklayabilirsiniz. Önemli olan, ziyaretçinin kontrolün elinde olmasıdır; çerezi kaldırabilir ve istedikleri zaman yeni bir ziyaretçi gibi görünebilirler.

Cevap #4

Bir olasılık flash çerezleri kullanmaktır:

  • Yaygın kullanılabilirlik (ziyaretçilerin %95'inin muhtemelen flash'ı olacak)
  • Çerez başına daha fazla veri depolayabilirsiniz (100 KB'a kadar)
  • Tarayıcılar arasında paylaşıldığı için bir makineyi benzersiz şekilde tanımlama olasılığı daha yüksektir
  • Tarayıcı çerezlerini temizlemek, flash çerezlerini kaldırmaz.

Onları okumak ve yazmak için küçük (gizli) bir Flash filmi oluşturmanız gerekecek.

Hangi yolu seçerseniz seçin, kullanıcılarınızın izlenmeyi kabul ettiğinden emin olun, aksi takdirde onların gizliliğini ihlal etmiş olursunuz ve kötü adamlardan biri haline gelirsiniz.

Cevap #5

Canvas parmak izi adı verilen popüler bir yöntem vardır, bu bilimsel makalede açıklanmıştır: The Web Never Forgets: Persistent Tracking Mechanisms in the Wild. Bir kez aramaya başladığınızda, ne kadar sık kullanıldığını görünce şaşıracaksınız. Bu yöntem, her tarayıcı/donanım kombinasyonu için tutarlı olan benzersiz bir parmak izi oluşturur.

Makale ayrıca evercookie'ler, yeniden oluşan http ve Flash çerezleri ve çerez senkronizasyonu gibi diğer kalıcı izleme yöntemlerini de inceliyor.

Canvas parmak izi hakkında daha fazla bilgi için buraya bakın:

  • Piksel Mükemmelliği: HTML5'te Canvas Parmak İzleme
  • https://en.wikipedia.org/wiki/Canvas_fingerprinting

Cevap #6

Bir evercookie'de benzersiz bir kimlik ayarlamayı denemek isteyebilirsiniz (tarayıcılar arası çalışacaktır, SSS'lerine bakın): http://samy.pl/evercookie/

Bu sorunu çözmek için birçok büyük şirket tarafından kullanılan ThreatMetrix adında bir şirket de var: http://threatmetrix.com/our-solutions/solutions-by-product/trustdefender-id/ Oldukça pahalılar ve bazı diğer ürünleri çok iyi değil, ama cihaz kimlikleri iyi çalışıyor.

Son olarak, panopticlick fikrinin bu açık kaynaklı jquery uygulaması var: https://github.com/carlo/jquery-browser-fingerprint Şu anda oldukça yarım gibi görünüyor ama geliştirilebilir.

Umarım yardımcı olur!

Cevap #7

HTTP bağlantısı üzerinden alabileceğiniz bilgi miktarı sadece azdır.

  1. IP - Ama başkalarının da söylediği gibi, bu birçok kullanıcı için, çoğu internet kullanıcısı için olmasa da, ISS'nin dinamik atama politikaları nedeniyle sabit değildir.

  2. Kullanıcı Aracısı Dizesi - Neredeyse tüm tarayıcılar, her istekte hangi tarayıcı olduklarını gönderir. Ancak, bu günlerde birçok tarayıcıda kullanıcı tarafından ayarlanabilir.

  3. İstek alanlarının koleksiyonu - Her istekle gönderilen başka alanlar da vardır, örneğin desteklenen kodlamalar vb. Bunlar, toplu olarak kullanıldığında bir kullanıcının bilgisayarını tanımlamaya yardımcı olabilir, ancak yine de tarayıcıya bağlıdır ve değiştirilebilir.

  4. Çerezler - Bir çerez ayarlamak, bir makineyi veya daha spesifik olarak bir makinedeki tarayıcıyı tanımlamanın başka bir yoludur, ancak diğerlerinin de söylediği gibi, bunlar kullanıcılar tarafından silinebilir veya kapatılabilir ve sadece bir tarayıcıda geçerlidir, bir makinede değil.

Yani, doğru cevap, sadece HTTP üzerinden IP protokollerini kullanarak yaşamak istediğiniz şeyi elde edemeyeceğinizdir. Ancak, çerezlerin yanı sıra IP ve HTTP isteğindeki alanların kombinasyonunu kullanarak, hangi makine olduğunu tahmin etme şansınız oldukça yüksektir, bir nevi. Kullanıcılar genellikle sadece bir tarayıcı kullanır ve çoğunlukla tek bir makineden, bu yüzden bu oldukça güvenilir olabilir, ancak bu, izleyici kitlesine bağlı olarak değişebilir...teknoloji meraklıları bu tür şeylerle daha fazla uğraşma eğilimindedir ve daha fazla makine/tarayıcı kullanır. Ayrıca, bu, IP'yi coğrafi olarak konumlandırmaya yönelik bir deneme ile birleştirilebilir ve bu veriler de kullanılabilir. Ama her durumda, her zaman doğru olacak bir çözüm yoktur.

Cevap #8

Hem çerez hem de çerez dışı yaklaşımlarda kusurlar var. Ama çerez yaklaşımının eksikliklerini affedebilirseniz, işte bir fikir.

Eğer zaten sitenizde Google Analytics kullanıyorsanız, benzersiz kullanıcıları kendiniz izlemek için kod yazmanıza gerek yoktur. Google Analytics bunu, Google'ın belgelerinde açıklandığı gibi __utma çerez değeri aracılığıyla yapar. Ve bu değeri yeniden kullanarak ek bir çerez yükü oluşturmazsınız, bu da sayfa isteklerinde verimlilik avantajları sağlar.

Ve bu değere erişmek için yeterince kolay bir şekilde bazı kodlar yazabilir ya da bu komut dosyasının getUniqueId() işlevini kullanabilirsiniz.

İlgili makaleler