>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
TypeScript

如何在不使用 Cookie 和注册的情况下识别用户

想象这样一种情况:用户以隐身模式访问你的网站,清除缓存,通过代理更改 IP,但你仍然需要确定这是同一个人。为什么?例如,为了防止攻击者无限次暴力破解密码,或者避免向同一个"新"客户第十次展示欢迎折扣。

LocalStorage 或 Cookie 等传统方法在这里会失效——它们可以一键清除。这正是 FingerprintJS 解决的问题。它是一个收集数十个间接浏览器和设备信号的库,用于创建唯一的访客标识符。

FingerprintJS logo

它是什么以及如何工作

FingerprintJS 是一个用于浏览器指纹识别的开源工具。简而言之,该库会查询浏览器:"你安装了哪些字体?你的屏幕分辨率是多少?你如何通过 Canvas 渲染图形?"

单独来看,这些数据并没有太大意义。数百万人在 Windows 上使用 Chrome,分辨率为 1920x1080。但当你将引擎版本、可用语言列表、时区、音频堆栈参数和特定字体渲染特征结合起来时,你会得到一个几乎对每个设备都独特的组合。所有这些数据都被哈希处理,你就得到了一个短字符串——visitorId

如何快速搭建项目

集成非常简单,对开发者友好。你可以通过 npm 安装:

npm install @fingerprintjs/fingerprintjs

只需几行代码即可启动:

import FingerprintJS from '@fingerprintjs/fingerprintjs'

async function initFingerprint() {
  // Инициализируем агент при запуске приложения
  const fpPromise = FingerprintJS.load()
  
  const fp = await fpPromise
  const result = await fp.get()

  // Вот он, наш уникальный ID
  console.log(result.visitorId)
}

initFingerprint()

如果你不想处理打包工具,该库可以通过 CDN 获取。但有一个问题:一些激进的广告拦截器或像 Brave 这样的浏览器可能会阻止从外部域加载脚本。在这种情况下,作者建议使用 npm 包并将代码打包到你自己的包中。

这在哪些场景真正有用

根据我的经验,这类工具最常出现在安全和分析任务中。

首先是欺诈预防。如果有人试图注册 50 个账户来增加推荐奖金,FingerprintJS 会突出显示所有这些"不同"的人都在同一台笔记本电脑后面。

其次是访问限制。你可以限制免费内容的查看次数(就像大型媒体那样),而无需强制用户登录。

第三是防止密码暴力破解。如果来自同一设备的登录尝试使用不同的用户名,这就是阻止该特定"指纹"访问的理由,而不会影响同一 IP 上的其他用户(例如,在一栋办公楼里)。

事先应该了解的事项

这个库很棒,但它不是"银弹"。开源版本有其局限性,开发者在 README 中诚实地写明了这些。

免费版本的准确性低于他们的商业云产品。由于所有计算都发生在客户端,高级用户可以伪造某些浏览器参数来更改他们的 ID。

此外,如果用户更新了浏览器或操作系统,他们的指纹可能会改变。它不是一个永久标识符,而是一个非常可靠的临时标记。

如果你需要添加一层安全性或基本分析而不使用 Cookie,FingerprintJS 是一个极好的选择。该项目非常活跃,拥有庞大的社区(在 GitHub 上有近 28,000 颗星)和清晰的文档。

它适合你吗?如果目标是过滤掉 90% 的机器人和业余欺诈者,那么绝对是。对于具有关键安全要求的银行系统,你可能需要查看他们的付费解决方案和服务器端验证,但对于大多数 Web 项目,MIT 版本的功能已经绰绰有余。

你可以在他们的演示页面上尝试这个库——在正常模式下打开它,然后在隐身模式下打开,你会看到魔法是如何实现的。

相关项目