实现浏览器指纹的三种常见方式

3,275 阅读2分钟

实现浏览器指纹的解决方案多种多样,本文列举其中三种常见的方案以及对应的代码示例,然后提供了一个测试文件,感兴趣的同学可以直接复制文件体验。

  1. FingerprintJS Library:

    FingerprintJS 是一个流行的JavaScript库,通过多种技术手段创建浏览器指纹。它利用用户代理、插件列表、字体信息等多个特征来生成唯一的指纹。

    <!-- 引入 FingerprintJS 库 -->
    <script src="https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@3"></script>
    
    // 使用 FingerprintJS 获取浏览器指纹
    const getBrowserFingerprint = async () => {
        const fpPromise = FingerprintJS.load();
        const fpInstance = await fpPromise;
    
        const result = await fpInstance.get();
    
        console.log(result.visitorId); // 浏览器指纹
    };
    
    getBrowserFingerprint();
    
  2. ClientJS Library:

    ClientJS 是另一个常用的JavaScript库,它通过检测浏览器的多个属性来生成指纹。该库提供了易于使用的接口,适用于多种浏览器指纹应用场景。

    <!-- 引入 ClientJS 库 -->
    <script src="https://cdn.jsdelivr.net/npm/clientjs"></script>
    
    // 使用 ClientJS 获取浏览器指纹
    const getClientJSFingerprint = () => {
        const client = new ClientJS();
        const fingerprint = client.getFingerprint();
    
        console.log(fingerprint); // 浏览器指纹
    };
    
    getClientJSFingerprint();
    
  3. Canvas Fingerprinting:

    Canvas fingerprinting利用浏览器在HTML5画布上渲染文本或图像时的细微差异。以下是一个简单的Canvas Fingerprinting示例:

    <canvas id="canvas" width="200" height="20"></canvas>
    
    // Canvas Fingerprinting 示例
    const getCanvasFingerprint = () => {
        const canvas = document.getElementById('canvas');
        const context = canvas.getContext('2d');
        const text = 'Canvas Fingerprint';
    
        context.font = '10px Arial';
        context.fillText(text, 10, 10);
    
        const imageData = canvas.toDataURL('image/png');
    
        console.log(imageData); // Canvas Fingerprint
    };
    
    getCanvasFingerprint();
    

上述示例展示了使用不同的JavaScript库或技术来实现浏览器指纹。下面是完整的测试文件:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="module">
        import FingerprintJS from 'https://cdn.jsdelivr.net/npm/@fingerprintjs/fingerprintjs@4.2.2/+esm'
        console.log(FingerprintJS)
        window.FingerprintJS = FingerprintJS;
    </script>

    <!-- 引入 ClientJS 库 -->
    <script src="https://cdn.jsdelivr.net/npm/clientjs"></script>
    <canvas id="canvas" width="200" height="20"></canvas>


</head>

<body>
    <script>
        window.onload = () => {
            // 使用 FingerprintJS 获取浏览器指纹
            const getBrowserFingerprint0 = async () => {
                const fpPromise = FingerprintJS.load();
                const fpInstance = await fpPromise;
                const result = await fpInstance.get();
                console.log(result.visitorId); // 浏览器指纹
            };

            getBrowserFingerprint0();

            // 使用 ClientJS 获取浏览器指纹
            const getClientJSFingerprint = () => {
                const client = new ClientJS();
                const fingerprint = client.getFingerprint();

                console.log(fingerprint); // 浏览器指纹
            };
            getClientJSFingerprint();

            // Canvas Fingerprinting 示例
            const getCanvasFingerprint2 = () => {
                const canvas = document.getElementById('canvas');
                const context = canvas.getContext('2d');
                const text = 'Canvas Fingerprint';
                context.font = '10px Arial';
                context.fillText(text, 10, 10);
                const imageData = canvas.toDataURL('image/png');
                console.log(imageData); // Canvas Fingerprint
            };

            getCanvasFingerprint2();
        }
    </script>
</body>

</html>