博客 / 詳情

返回

瀏覽器 15 個常見指紋特徵,使用插件 FingerprintJS 生成瀏覽器指紋

瀏覽器指紋是什麼?

像人類的指紋一樣,瀏覽器指紋也是用於唯一身份認證的一種標識。

這東東常被廣告商用於用户跟蹤,比如 A、B 網站都添加了一個廣告商,如果用户訪問了 A 網站,查看了些商品或文章,然後再訪問 B 網站,那麼廣告商就知道用户對哪些東西感興趣,就可以在 B 網站中投放一些感興趣的廣告。

瀏覽器指紋起的作用就是給用户打上唯一標識,用户每次訪問網頁都會被獲取到這個唯一標識符,這樣就實現了用户未登錄情況下跟蹤用户行為,從而繪製用户畫像。

所以其實用户所有的操作行為都會被跟蹤,雖然説瀏覽器提供了無痕模式,其實有很多瀏覽器的指紋特徵與是不是無痕模式沒太大關係,非無痕模式訪問網站獲取到的指紋特徵是一個值 xxxx,無痕模式再訪問獲取的指紋還是這個 xxxx

指紋特徵

1、IP 地址

用户發起請求到服務器時,都會攜帶一個網絡IP,這個 IP 一般會固定一段時間(與運營商有關),有些大型商用網絡還會購買固定 IP 地址,而請求中的這個 IP 地址,就有可能被用於指紋特徵計算。

2、Canvas指紋

利用每個瀏覽器 Canvas 繪圖的不同,也可以生成一個指紋特徵。

3、WebGL 與 WebGPU 指紋

與 Canvas 類似,利用 3D 圖形渲染差異來生成指紋特徵。

4、字體指紋

通過檢測瀏覽器的特定字體大小,判斷是否已安裝某個字體,從而獲得一種指紋特徵。

5、Client Rects

由於瀏覽器渲染 HTML 存在差異性,可通過獲取某個元素的上下左右位置及寬度和高度等信息,可生成指紋特徵。

6、音頻指紋

利用不同瀏覽器的 AudioContext 在處理音頻數據的差異性,可生成一種指紋特徵。

7、瀏覽器語言

瀏覽器配置的語言信息也可以用作指紋特徵算法。

8、屏幕分辨率

瀏覽器的窗口大小信息,在指紋算法中,也可納入特徵庫。

9、時區與當地時間

不同國家的時區與時間都存在差異,也可以通過此特徵來獲取指紋。

10、User-Agent

瀏覽器的 UA 信息,每個瀏覽器都不同,相同瀏覽器的不同版本也存在差異,完全可以當做一種指紋特徵。

11、設備內存

雖然 navigator.deviceMemory 獲取到的值不一定是準確的內存值,但此屬性用作指紋特徵算法是完全可行的。

12、CPU 數量

navigator.hardwareConcurrency 獲取 CPU 數量,也可投入到指紋算法中。

13、SpeechSynthesis

利用 SpeechSynthesis 瀏覽器的語音合成功能,由於語音、發音、口音、語速等差異性,可作為指紋特徵算法。

14、地理位置

如果隨手點了同意獲取地理位置,那瀏覽器背後就可以開始用地理位置信息來生成指紋特徵了,畢竟每個位置信息是有差異性的。

15.媒體設備

利用 MediaDevices API 獲取媒體設備信息,如攝像頭、麥克風、設備類型、標籤名字、鏈接類型等,這些信息也可用於指紋特徵算法。

與地理位置一樣需要用户同意,同意後就可以開始搞事情。

FingerprintJS 插件生成指紋

瀏覽器開源插件 FingerprintJS,截止發文有 24.5k Star,github 地址:https://github.com/fingerprintjs/fingerprintjs

FingerprintJS 3.0 版本可免費使用, 4.0 版本之後商業用途需要付費,測試、個人學習用途無需付費。

瀏覽器端的 FingerprintJS 準確性僅有 40% - 60%,如果需要更高的準確性,可付費使用 Fingerprint Pro,官網:https://fingerprint.com/github/。

此插件獲取了瀏覽器 41 個特徵用於指紋算法:

[
  'fonts', 'domBlockers', 'fontPreferences', 'audio',
  'screenFrame', 'canvas', 'osCpu', 'languages',
  'colorDepth', 'deviceMemory', 'screenResolution',
  'hardwareConcurrency', 'timezone', 'sessionStorage',
  'localStorage', 'indexedDB', 'openDatabase', 'cpuClass',
  'platform', 'plugins', 'touchSupport', 'vendor',
  'vendorFlavors', 'cookiesEnabled', 'colorGamut',
  'invertedColors', 'forcedColors', 'monochrome',
  'contrast', 'reducedMotion', 'reducedTransparency',
  'hdr', 'math', 'pdfViewerEnabled', 'architecture',
  'applePay', 'privateClickMeasurement', 'audioBaseLatency',
  'dateTimeLocale', 'webGlBasics', 'webGlExtensions'
]

參考地址:https://fingerprintjs.github.io/fingerprintjs/

使用方法

方法一:script 引入

<script src="https://openfpcdn.io/fingerprintjs/v3/iife.min.js"></script>
<script>
// 獲取標識符
FingerprintJS.load()
  .then(fp => fp.get())
  .then(result => {
    const visitorId = result.visitorId
    console.log(visitorId)
  })
</script>

方法二:npm 安裝

npm install --save @fingerprintjs/fingerprintjs
# 安裝指定版本 3.4.2
npm install --save @fingerprintjs/fingerprintjs@3.4.2
import FingerprintJS from '@fingerprintjs/fingerprintjs';

// 獲取標識符
FingerprintJS.load()
  .then(fp => fp.get())
  .then(result => {
    const visitorId = result.visitorId
    console.log(visitorId)
  })

方法三:模塊化引入

<script>
  // 也可使用此地址: https://openfpcdn.io/fingerprintjs/v3/esm.min.js
  const fpPromise = import('https://openfpcdn.io/fingerprintjs/v3')
    .then(FingerprintJS => FingerprintJS.load())

  // 獲取標識符
  fpPromise
    .then(fp => fp.get())
    .then(result => console.log(result.visitorId))
</script>

配置項

FingerprintJS.load({
  delayFallback?: number, // 為不支持 requestIdleCallback 的瀏覽器設置回退時間
  debug?: boolean, // 是否打印調試信息
  monitoring?: boolean, // 是否發送使用統數據到FingerprintJS服務器
}): Promise<Agent>

文檔

V3 文檔:https://github.com/fingerprintjs/fingerprintjs/blob/v3/docs/api.md
最新版本文檔:https://github.com/fingerprintjs/fingerprintjs/blob/master/docs/api.md

寫在最後

瀏覽器指紋可以讓網站記住您是誰,也讓廣告商能實現精準投放廣告。互聯網不是法外之地,每一次訪問,技術上都有辦法跟蹤,所以説大數據讓人毫無隱私~~

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.