You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中获取独立于版本且区分克隆浏览器的唯一标识?

解决方案:获取版本无关且区分克隆浏览器的唯一标识

首先明确:浏览器的本地二进制路径属于客户端隐私信息,HTTP请求不会将该数据发送到服务端,因此PHP无法直接获取,这个思路走不通,可参考以下实际可行的方案:

一、利用HTTP请求头中的专属标识

多数克隆浏览器会在请求头中添加专属字段,或修改UA字符串里的特征标识,这类信息不会随版本变更,可直接区分原版与克隆版:

  • 区分Brave和Chrome:Brave会发送Brave-Version请求头,Chrome无此字段。PHP判断示例:
    $browserId = '';
    if (isset($_SERVER['HTTP_BRAVE_VERSION'])) {
        $browserId = 'brave';
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'Brave') === false) {
        $browserId = 'chrome';
    }
    
  • 区分Waterfox和Firefox:Waterfox的UA字符串会包含Waterfox关键字,原版Firefox则是Firefox,直接提取该关键字即可,不受版本号影响:
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'Waterfox') !== false) {
        $browserId = 'waterfox';
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== false) {
        $browserId = 'firefox';
    }
    
  • 使用客户端提示头(更可靠):现代浏览器支持Sec-CH-UA和Sec-CH-UA-Full-Version-List请求头,其中明确分离了浏览器品牌名称与版本号。例如Chrome的Sec-CH-UA为"Google Chrome";v="132", "Not:A-Brand";v="8",Brave的为"Brave";v="132", "Not:A-Brand";v="8"。PHP解析示例:
    $browserBrand = '';
    if (isset($_SERVER['HTTP_SEC_CH_UA'])) {
        $uaBrands = $_SERVER['HTTP_SEC_CH_UA'];
        preg_match('/"([^"]+?)";v="/', $uaBrands, $matches);
        if (!empty($matches[1])) {
            $browserBrand = $matches[1];
            $browserId = strtolower(str_replace(' ', '-', $browserBrand));
        }
    }
    
    该方式的优势是品牌标识与版本号完全独立,版本升级不会改变标识结果。

二、借助客户端JS获取专属特征后传给PHP

部分浏览器的专属特征仅能通过JS检测,例如Brave的专属API,可将检测结果传递给服务端:

  1. 前端JS代码:
    let browserId = '';
    // 检测Brave
    if (navigator.brave && await navigator.brave.isBrave()) {
        browserId = 'brave';
    } 
    // 检测Chrome(排除Brave)
    else if (navigator.userAgentData?.brands.some(brand => brand.brand === 'Google Chrome')) {
        browserId = 'chrome';
    }
    // 检测Waterfox
    else if (navigator.userAgent.includes('Waterfox')) {
        browserId = 'waterfox';
    }
    // 检测Firefox
    else if (navigator.userAgent.includes('Firefox')) {
        browserId = 'firefox';
    }
    // 传递结果到PHP
    fetch('/save-browser-id.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({browserId: browserId})
    });
    
  2. 后端PHP代码(save-browser-id.php):
    session_start();
    $data = json_decode(file_get_contents('php://input'), true);
    $_SESSION['stable_browser_id'] = $data['browserId'] ?? '';
    

三、轻量特征组合生成稳定标识

若需要更通用的方案,可将多个稳定的浏览器特征组合,生成哈希值,确保同浏览器(不同版本)哈希一致,不同浏览器(含克隆版)哈希不同:

  1. 前端JS收集特征并生成哈希:
    const features = [
        navigator.userAgentData?.brands[0]?.brand || '',
        navigator.brave ? 'brave' : '',
        navigator.platform,
        navigator.vendor
    ];
    const featureStr = features.filter(Boolean).join('|');
    const stableId = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(featureStr))
        .then(buffer => Array.from(new Uint8Array(buffer))
            .map(b => b.toString(16).padStart(2, '0'))
            .join(''));
    // 传递到PHP
    fetch('/save-stable-id.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({stableId: stableId})
    });
    
  2. 后端PHP接收并存储:
    session_start();
    $data = json_decode(file_get_contents('php://input'), true);
    $_SESSION['stable_browser_id'] = $data['stableId'] ?? '';
    
    该方式生成的标识,只要浏览器核心特征不变(如仍为Brave,无论版本升级),哈希值就不会改变;克隆版与原版特征不同,哈希值也会存在差异。

内容的提问来源于stack exchange,提问作者php and js

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:37:26