欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

利用FingerprintJS做瀏覽器指紋的實現方案

admin
2023年8月4日 1:23 本文熱度 616

背景

運營同事發現大量的拼單、淘寶和閑魚上的會員賬號租借服務、外借賬號等問題已經影響到了公司營收。為了緩解這種問題,我們決定限制單一賬號能夠保持登陸狀態的設備數量,以此提高租借賬號的成本。要想限制設備,首先要解決的問題就是如何識別一臺設備。這可以借助FingerprintJS 來解決,然而并不是所有指紋選項都能夠投入到生產環境。高熵值的指紋確實可以增加設備的識別率,但卻會導致設備指紋頻繁變化,從而引起用戶頻繁掉線,最終影響用戶體驗。因此我需要解決的第一個問題就是在設備識別率和用戶體驗之間找到一個熵值的平衡點。我采取的方案是先在各個試點項目中接入計算指紋的邏輯,并不定期給后端發送最新指紋計算結果,后端將這些數據收集起來進行分析,最終在指紋變化頻率在可接受范圍內找到盡可能多的指紋選項。

數據

每條記錄都包含下列字段。

  • 指紋(由小寫字母和數字組成的32位字符串)

    下列32項是從用戶瀏覽器收集到的指紋的名稱。每個名稱對應表的一個同名字段。如果對這些指紋的計算邏輯有興趣可以看看我的這篇文章

    fonts、domBlockers、fontPreferences、audio、screenFrame、osCpu、languages、colorDepth、deviceMemory、screenResolution、hardwareConcurrency、timezone、sessionStorage、localStorage、indexedDB、openDatabase、cpuClass、platform、plugins、canvas、touchSupport、vendor、vendorFlavors、cookiesEnabled、colorGamut、invertedColors、forcedColors、monochrome、contrast、reducedMotion、hdr、math

  • 標記(由小寫字母和數字組成的32位字符串):browserMark

  • 創建時間(unix):createdAt

  • 生成單個指紋所需時間(秒):generateTime

篩選可用指紋

上述的32類指紋不一定每個都符合我們的上線指標,因此要經過篩選。判斷一個指紋是否可用需要參考兩個指標,這兩個指標必須同時合格才能被認定是可用指紋。

「平均變化周期」指標

在這一指標中,我需要觀察單個指紋的「平均變化周期」 是否在大多數設備上都能達到可接受的水平。

后端計算

中間變量的計算規則

在計算出最終結果之前會產生一些中間變量,下面列出了這些變量的計算規則。這些計算規則只是為了講述清楚我希望得到什么樣的計算結果,而不是要對計算過程的寫法做出的規定。

fcc(指紋變化周期)

依據browserMark對記錄分組,同組按照createdAt升序排列。 從頭依次遍歷組內記錄,對每條記錄還需依次遍歷其全部種類的指紋。對于每一類指紋,都應做如下處理:

用當前記錄的指紋比對相同指紋的「上一條記錄」,判斷兩者是否一致。若不一致 則認為此指紋發生了變化。 那么指紋本次的變化周期為當前記錄的createdAt減去當前指紋的「上一條記錄」的createdAt得到的差值。同時當前記錄作為此指紋的「上一條記錄」。若一致 則認為指紋沒有變化,繼續遍歷下一條記錄。

如果上面這段描述不夠清晰,可以結合下面的偽代碼來輔助理解:

const allRecord //查詢得到的全部記錄const fccCollector = {}for (let gi = 0; gi < allRecord.groupCount; gi++) {
  const lastRecordMap = {} //這里存儲了各指紋的「上一條記錄」
  const group = allRecord[gi] //當前分組
  for (let ri = 0; ri < group.rowCount; ri++) {
    const row = group[ri]; //當前記錄(行)
    for (let ci = 0; ci < row.columnCount; ci++) {
      const col = row[ci]; //當前列
      const fingerprintName = col.name;//指紋的名稱
      const fingerprintValue = col.value;//指紋的值
      const lastRecord = lastRecordMap[fingerprintName];//取出「上一條記錄」
      if (lastRecord && lastRecord.value != fingerprintValue) {//此時認為指紋發生了變化
        const fcc = col.createdAt - lastRecord.createdAt; //計算本次的變化周期
        fccCollector[col.browserMark][fingerprintName] = fcc //將本次fcc存起來
        lastRecordMap[fingerprintName] = { value: fingerprintValue, createdAt: row.createdAt };
      }
      else if (!lastRecord) {//此時認為是此類型指紋首次出現
        lastRecordMap[fingerprintName] = { value: fingerprintValue, createdAt: row.createdAt };
      }
    }
  }}123456789101112131415161718192021222324252627

上述偽代碼中fccCollector變量的結構如下:

fccCollector={
  browserMark1:{
    fonts:[123,4341,111], //單位s,每一個數組元素是一個變化周期
    domBlockers:[4213],
    ...//依次是32個指紋
  },
  browserMark2:{
    fonts:[123],
    domBlockers:[123],
    ...
  },
  ...//依次是全部的browserMark}

上述偽代碼中lastRecord變量的結構如下:

  {
    fonts:{
    	value:"cde2267cc4c61e7bd9ebb893e2da3193",
    	createdAt:1640835596
    },
    domBlockers:{
    	value:"fa2fc67cc4c61e7bd9ebb893e2da3512",
    	createdAt:1640835341
    },
    ...
  }
afcc(指紋平均變化周期):

全部變化周期相加的和除以變化周期的數量,對計算結果向上取整。如果沒有變化,則認為變化周期是0。但凡有變化,由于向上取整,平均變化周期必然大于等于1。偽代碼如下:

//例如計算browserMark為cde2267cc4c61e7bd9ebb893e2da3193的設備的fonts指紋的平均變化周期function calculateAfcc() {
  const browserMark = "cde2267cc4c61e7bd9ebb893e2da3193"
  const fontsFcc = fccCollector[browserMark].fonts;
  let sum = 0
  if (fontsFcc.length > 0) {
    for (let i = 0; i < fontsFcc.length; i++) {
      sum += fontsFcc[i]
    }
    return Math.ceil(sum / fontsFcc.length)
  }
  return 0}
最終結果的計算規則

后端計算方法允許接受兩個 參數

  • t:數據的時間范圍。只對范圍t內的數據做計算。

  • x:指紋必須滿足的「平均變化周期」下限。單位是秒。(基本等同于token過期時間)

計算結果 如下:

  • p:「平均變化周期」大于等于x的browserMark 占比。

計算方法的描述

根據t來篩選指定日期范圍內的記錄,并按照browserMark分組,分組數記為c。然后計算每組內每種指紋的「平均變化周期」,也就是說每個browserMark都會對應32個「平均變化周期」。然后按照32種指紋將全部「平均變化周期」分成32組,每組有c條數據。遍歷這c條數據計算出值大于等于x的條目的數量,用這個數量除以c,得到p。

前端展現


(為保護機密,上圖使用虛擬數據)

因為很難做到某個指紋在所有設備上的平均變化周期都大于等于x,因此在前端還要經過一道篩選,來決定要放棄多少設備。

  • n:能夠接受的p的最小值。即某種指紋的p大于等于n則認為指紋的平均變化周期指標是合格的。

  • cn:100%-n得到的值。基本等同于放棄cn臺設備的使用體驗(實際放棄的設備比例會小于cn)。

「生成時間」指標

在這一指標中,我需要觀察指紋的「生成時間」 是否在大多數設備上都能達到可接受的水平。

后端計算

中間變量的計算規則

在計算出最終結果之前會產生一些中間變量,下面列出了這些變量的計算規則。同樣的,這些計算規則只是為了講述清楚我希望得到什么樣的計算結果,而不是要對計算過程的寫法做出的規定。

每臺設備的某指紋的平均生成時間

依據browserMark對記錄做分組,用組內每條記錄的createdAt相加得到的和除以組內記錄的數量得到平均生成時間。對計算結果向上取整。

最終結果的計算規則

后端計算方法允許接受兩個 參數,如下:

  • t:數據的時間范圍。只對范圍t內的數據做計算。

  • x:指紋必須滿足的「生成時間」上限。單位是ms。(因為每次接口請求都要計算指紋,所以等指紋功能上線后每個項目的每個接口的都會至多增加「x*合格指紋數量」的時間花費。)

計算結果 如下:

  • p:「平均生成時間」小于等于x的browserMark 占比。

計算方法的描述

根據t來篩選指定日期范圍內的記錄,并按照browserMark分組,分組數記為c。然后計算每組內每種指紋的「平均生成時間」,也就是說每個browserMark都會對應32個「平均生成時間」。然后按照32種指紋將全部「平均生成時間」分成32組,每組有c條數據。遍歷這c條數據計算出值小于等于x的條目數量,用這個數量除以c,得到p。

前端展現

因為很難做到某個指紋在所有設備上的平均生成時間都小于等于x,因此在前端還要經過一道篩選,來決定要放棄多少設備的使用體驗。

  • n:能夠接受的p的最大值。即某種指紋的p大于等于n則認為此指紋的平均生成時間指標是合格的。

  • cn:100%-n得到的值。基本等同于放棄cn臺設備的使用體驗(實際放棄的設備比例會小于cn)。


該文章在 2023/8/4 1:23:36 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved