
有些網(wǎng)站是會(huì)員制,而且對(duì)會(huì)員所用的機(jī)器會(huì)有一個(gè)綁定,這就意味著一個(gè)用戶(hù)只能在固定的機(jī)器上或?yàn)g覽器上登陸,如果換了電腦或?yàn)g覽器那很不幸,請(qǐng)聯(lián)系商家解綁,類(lèi)似的還有某些企業(yè)通過(guò)下載終端的方式進(jìn)行綁定,當(dāng)然這樣對(duì)用戶(hù)體驗(yàn)有很大的影響,總而言之都是為了保護(hù)企業(yè)的利益,你懂的!言歸正傳,既然說(shuō)到綁定機(jī)器,那他們是怎么實(shí)現(xiàn)的呢?當(dāng)然方法很多,今天我們說(shuō)一下通過(guò)獲取瀏覽器指紋的方式來(lái)識(shí)別用戶(hù)是否更換了機(jī)器(嘗試用js獲取用戶(hù)物理地址的還是放棄吧,IE可能還給你點(diǎn)機(jī)會(huì), 反正我是不想再研究了,能力有限).
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.staticfile.org/fingerprintjs2/2.1.0/fingerprint2.min.js"></script>
<script>
function finger() {
let excludes = {};
excludes.audio = true;
excludes.fontsFlash = true;
excludes.webgl = true;
excludes.canvas = true;
excludes.enumerateDevices = true;
let options = {excludes: excludes};
Fingerprint2.get(options, function (components) {
const values = components.map(function (component) {
return component.value
});
const murmur = Fingerprint2.x64hash128(values.join(''), 31);
alert(murmur)
});
}
</script>
</head>
<body>
<button onclick="finger()">點(diǎn)擊</button>
</body>
</html>
代碼很簡(jiǎn)單,有點(diǎn)前端基礎(chǔ)的都能看懂,這里主要是利用了前端 fingerprint2這個(gè)庫(kù)來(lái)實(shí)現(xiàn),這里我主要通過(guò)audio,fontsFlash,webgl,canvas,enumerateDevices這幾項(xiàng)來(lái)識(shí)別的,返回的是一個(gè)MD5值,可以嘗試清除緩存刷新,發(fā)現(xiàn)它是不會(huì)變化的,如果換個(gè)瀏覽器或換臺(tái)機(jī)器,它會(huì)返回不同的值,當(dāng)然配置項(xiàng)不止這幾個(gè),可以根據(jù)自己的實(shí)際情況配置,獲取到用戶(hù)瀏覽器指紋再加上用戶(hù)的ip就可以防止用戶(hù)使用代理ip對(duì)信息進(jìn)行采集,具體實(shí)現(xiàn)也不多說(shuō)了.
userAgent: navigator.userAgent
language: 語(yǔ)言
colorDepth: 返回目標(biāo)設(shè)備或緩沖器上的調(diào)色板的比特深度 screen.colorDepth
deviceMemory: 以千兆字節(jié)為單位返回設(shè)備內(nèi)存量。該值是通過(guò)舍入到最接近的2的冪并將該數(shù)除以1024而給出的近似值
pixelRatio: 像素比 devicePixelRatio
hardwareConcurrency: navigator.hardwareConcurrency 返回可用于運(yùn)行在用戶(hù)的計(jì)算機(jī)上的線程的邏輯處理器的數(shù)量
screenResolution: 檢測(cè)屏幕寬高,并根據(jù)屏幕方向矯正返回值[width,height]
availableScreenResolution: 返回屏幕分辨率[width,height],無(wú)頭瀏覽器無(wú)法獲取
timezoneOffset: 返回從當(dāng)前區(qū)域設(shè)置(主機(jī)系統(tǒng)設(shè)置)到UTC的時(shí)區(qū)差異(以分鐘為單位)
timezone: 時(shí)區(qū)
sessionStorage: 是否支持 sessionStorage,不支持時(shí)返回錯(cuò)誤
localStorage: 是否支持 localStorage
indexedDb: 是否支持 indexedDb
addBehavior :此時(shí)可能未定義body或以編程方式刪除
openDatabase: 返回是否支持 Web SQL
cpuClass: 返回瀏覽器系統(tǒng)的 CPU 等級(jí),一般無(wú)法獲取
platform: 返回表示瀏覽器平臺(tái)的字符串,該規(guī)范允許瀏覽器始終返回空字符串,因此不要依賴(lài)此屬性來(lái)獲得可靠的答案
doNotTrack: 返回用戶(hù)的“不跟蹤”設(shè)置。如果用戶(hù)請(qǐng)求不被網(wǎng)站,內(nèi)容或廣告跟蹤,則為“1”
plugins: 返回瀏覽器安裝的插件列表
canvas: 如果瀏覽器支持canvas則返回生成baes64數(shù)據(jù)
webgl: 返回瀏覽器對(duì)webgl繪圖協(xié)議的支持情況匯總
webglVendorAndRenderer: 返會(huì)顯卡型號(hào)相關(guān)信息
adBlock: 返回是否安裝去廣告插件
hasLiedLanguages: 返回用戶(hù)是否改變了首選語(yǔ)言
hasLiedResolution: 返回用戶(hù)是否改變了分辨率
hasLiedOs: 返回用戶(hù)是否改變了操作系統(tǒng)
hasLiedBrowser: 返回用戶(hù)是否改變了瀏覽器
touchSupport: 返回最大觸摸點(diǎn)數(shù),是否支持touch,是否支持ontouchstart事件
fonts: 返回從64種字體種篩選出的可用字體
fontsFlash: Flash字體枚舉,如果沒(méi)有swfobject,不會(huì)觸發(fā)
audio: 返回音頻指紋
enumerateDevices: navigator.mediaDevices 請(qǐng)求可用媒體輸入和輸出設(shè)備的列表,例如麥克風(fēng),相機(jī),耳機(jī)等
您發(fā)布的評(píng)論即表示同意遵守以下條款:
一、不得利用本站危害國(guó)家安全、泄露國(guó)家秘密,不得侵犯國(guó)家、社會(huì)、集體和公民的合法權(quán)益;
二、不得發(fā)布國(guó)家法律、法規(guī)明令禁止的內(nèi)容;互相尊重,對(duì)自己在本站的言論和行為負(fù)責(zé);
三、本站對(duì)您所發(fā)布內(nèi)容擁有處置權(quán)。