如何在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,可将检测结果传递给服务端:
- 前端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}) }); - 后端PHP代码(save-browser-id.php):
session_start(); $data = json_decode(file_get_contents('php://input'), true); $_SESSION['stable_browser_id'] = $data['browserId'] ?? '';
三、轻量特征组合生成稳定标识
若需要更通用的方案,可将多个稳定的浏览器特征组合,生成哈希值,确保同浏览器(不同版本)哈希一致,不同浏览器(含克隆版)哈希不同:
- 前端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}) }); - 后端PHP接收并存储:
该方式生成的标识,只要浏览器核心特征不变(如仍为Brave,无论版本升级),哈希值就不会改变;克隆版与原版特征不同,哈希值也会存在差异。session_start(); $data = json_decode(file_get_contents('php://input'), true); $_SESSION['stable_browser_id'] = $data['stableId'] ?? '';
内容的提问来源于stack exchange,提问作者php and js
相关产品推荐
相关产品推荐

