狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

利用FingerprintJS做瀏覽器指紋的實(shí)現(xiàn)方案

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

背景

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

數(shù)據(jù)

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

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

    下列32項(xiàng)是從用戶瀏覽器收集到的指紋的名稱。每個(gè)名稱對(duì)應(yīng)表的一個(gè)同名字段。如果對(duì)這些指紋的計(jì)算邏輯有興趣可以看看我的這篇文章

    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

  • 標(biāo)記(由小寫(xiě)字母和數(shù)字組成的32位字符串):browserMark

  • 創(chuàng)建時(shí)間(unix):createdAt

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

篩選可用指紋

上述的32類指紋不一定每個(gè)都符合我們的上線指標(biāo),因此要經(jīng)過(guò)篩選。判斷一個(gè)指紋是否可用需要參考兩個(gè)指標(biāo),這兩個(gè)指標(biāo)必須同時(shí)合格才能被認(rèn)定是可用指紋。

「平均變化周期」指標(biāo)

在這一指標(biāo)中,我需要觀察單個(gè)指紋的「平均變化周期」 是否在大多數(shù)設(shè)備上都能達(dá)到可接受的水平。

后端計(jì)算

中間變量的計(jì)算規(guī)則

在計(jì)算出最終結(jié)果之前會(huì)產(chǎn)生一些中間變量,下面列出了這些變量的計(jì)算規(guī)則。這些計(jì)算規(guī)則只是為了講述清楚我希望得到什么樣的計(jì)算結(jié)果,而不是要對(duì)計(jì)算過(guò)程的寫(xiě)法做出的規(guī)定。

fcc(指紋變化周期)

依據(jù)browserMark對(duì)記錄分組,同組按照createdAt升序排列。 從頭依次遍歷組內(nèi)記錄,對(duì)每條記錄還需依次遍歷其全部種類的指紋。對(duì)于每一類指紋,都應(yīng)做如下處理:

用當(dāng)前記錄的指紋比對(duì)相同指紋的「上一條記錄」,判斷兩者是否一致。若不一致 則認(rèn)為此指紋發(fā)生了變化。 那么指紋本次的變化周期為當(dāng)前記錄的createdAt減去當(dāng)前指紋的「上一條記錄」的createdAt得到的差值。同時(shí)當(dāng)前記錄作為此指紋的「上一條記錄」。若一致 則認(rèn)為指紋沒(méi)有變化,繼續(xù)遍歷下一條記錄。

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

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

上述偽代碼中fccCollector變量的結(jié)構(gòu)如下:

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

上述偽代碼中lastRecord變量的結(jié)構(gòu)如下:

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

全部變化周期相加的和除以變化周期的數(shù)量,對(duì)計(jì)算結(jié)果向上取整。如果沒(méi)有變化,則認(rèn)為變化周期是0。但凡有變化,由于向上取整,平均變化周期必然大于等于1。偽代碼如下:

//例如計(jì)算browserMark為cde2267cc4c61e7bd9ebb893e2da3193的設(shè)備的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}
最終結(jié)果的計(jì)算規(guī)則

后端計(jì)算方法允許接受兩個(gè) 參數(shù)

  • t:數(shù)據(jù)的時(shí)間范圍。只對(duì)范圍t內(nèi)的數(shù)據(jù)做計(jì)算。

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

計(jì)算結(jié)果 如下:

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

計(jì)算方法的描述

根據(jù)t來(lái)篩選指定日期范圍內(nèi)的記錄,并按照browserMark分組,分組數(shù)記為c。然后計(jì)算每組內(nèi)每種指紋的「平均變化周期」,也就是說(shuō)每個(gè)browserMark都會(huì)對(duì)應(yīng)32個(gè)「平均變化周期」。然后按照32種指紋將全部「平均變化周期」分成32組,每組有c條數(shù)據(jù)。遍歷這c條數(shù)據(jù)計(jì)算出值大于等于x的條目的數(shù)量,用這個(gè)數(shù)量除以c,得到p。

前端展現(xiàn)


(為保護(hù)機(jī)密,上圖使用虛擬數(shù)據(jù))

因?yàn)楹茈y做到某個(gè)指紋在所有設(shè)備上的平均變化周期都大于等于x,因此在前端還要經(jīng)過(guò)一道篩選,來(lái)決定要放棄多少設(shè)備。

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

  • cn:100%-n得到的值。基本等同于放棄cn臺(tái)設(shè)備的使用體驗(yàn)(實(shí)際放棄的設(shè)備比例會(huì)小于cn)。

「生成時(shí)間」指標(biāo)

在這一指標(biāo)中,我需要觀察指紋的「生成時(shí)間」 是否在大多數(shù)設(shè)備上都能達(dá)到可接受的水平。

后端計(jì)算

中間變量的計(jì)算規(guī)則

在計(jì)算出最終結(jié)果之前會(huì)產(chǎn)生一些中間變量,下面列出了這些變量的計(jì)算規(guī)則。同樣的,這些計(jì)算規(guī)則只是為了講述清楚我希望得到什么樣的計(jì)算結(jié)果,而不是要對(duì)計(jì)算過(guò)程的寫(xiě)法做出的規(guī)定。

每臺(tái)設(shè)備的某指紋的平均生成時(shí)間

依據(jù)browserMark對(duì)記錄做分組,用組內(nèi)每條記錄的createdAt相加得到的和除以組內(nèi)記錄的數(shù)量得到平均生成時(shí)間。對(duì)計(jì)算結(jié)果向上取整。

最終結(jié)果的計(jì)算規(guī)則

后端計(jì)算方法允許接受兩個(gè) 參數(shù),如下:

  • t:數(shù)據(jù)的時(shí)間范圍。只對(duì)范圍t內(nèi)的數(shù)據(jù)做計(jì)算。

  • x:指紋必須滿足的「生成時(shí)間」上限。單位是ms。(因?yàn)槊看谓涌谡?qǐng)求都要計(jì)算指紋,所以等指紋功能上線后每個(gè)項(xiàng)目的每個(gè)接口的都會(huì)至多增加「x*合格指紋數(shù)量」的時(shí)間花費(fèi)。)

計(jì)算結(jié)果 如下:

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

計(jì)算方法的描述

根據(jù)t來(lái)篩選指定日期范圍內(nèi)的記錄,并按照browserMark分組,分組數(shù)記為c。然后計(jì)算每組內(nèi)每種指紋的「平均生成時(shí)間」,也就是說(shuō)每個(gè)browserMark都會(huì)對(duì)應(yīng)32個(gè)「平均生成時(shí)間」。然后按照32種指紋將全部「平均生成時(shí)間」分成32組,每組有c條數(shù)據(jù)。遍歷這c條數(shù)據(jù)計(jì)算出值小于等于x的條目數(shù)量,用這個(gè)數(shù)量除以c,得到p。

前端展現(xiàn)

因?yàn)楹茈y做到某個(gè)指紋在所有設(shè)備上的平均生成時(shí)間都小于等于x,因此在前端還要經(jīng)過(guò)一道篩選,來(lái)決定要放棄多少設(shè)備的使用體驗(yàn)。

  • n:能夠接受的p的最大值。即某種指紋的p大于等于n則認(rèn)為此指紋的平均生成時(shí)間指標(biāo)是合格的。

  • cn:100%-n得到的值。基本等同于放棄cn臺(tái)設(shè)備的使用體驗(yàn)(實(shí)際放棄的設(shè)備比例會(huì)小于cn)。


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