能否通过JavaScript检测Ubiquiti UniFi Security Gateway?
间接检测Ubiquiti UniFi Security Gateway的可行方案
由于浏览器无法直接获取路由器硬件信息,只能通过UniFi网关的特有行为或配置特征做间接推断,以下是几种可落地的检测思路:
1. 检测DNS劫持特征
部分UniFi网关会开启DNS劫持功能,查询不存在的域名时会返回网关自身IP或自定义错误页面地址。可通过加载不存在域名的资源,判断是否跳转到UniFi相关地址:
function detectUniFiDNSHijack() { return new Promise(resolve => { const testDomain = 'dummy-unifi-test-domain.com'; const img = new Image(); img.onload = () => { const isUniFi = img.src.includes('192.168.1.1') || img.src.includes('ubnt.com'); resolve(isUniFi); }; img.onerror = () => resolve(false); img.src = `http://${testDomain}/test.png?${Date.now()}`; }); } // 使用示例 detectUniFiDNSHijack().then(isUniFi => { if (isUniFi) { // 展示针对UniFi网关的指导方案 document.getElementById('unifi-guide').style.display = 'block'; } });
局限性:若用户关闭DNS劫持功能,该方法失效;其他品牌网关也可能存在类似劫持行为,存在误判可能。
2. 检查HTTP响应头标识
部分配置下的UniFi网关会在处理HTTP请求时添加含ubnt或unifi的自定义响应头,可通过请求自身服务器接口检查响应头特征:
async function detectUniFiHeader() { try { const res = await fetch('/ping', { method: 'HEAD' }); const hasUniFiHeader = Object.keys(res.headers).some(key => key.toLowerCase().includes('ubnt') || key.toLowerCase().includes('unifi') ); return hasUniFiHeader; } catch (err) { return false; } } // 使用示例 detectUniFiHeader().then(isUniFi => { if (isUniFi) { console.log('可能检测到UniFi网关'); } });
局限性:仅当网关开启HTTP代理或自定义头注入功能时有效,通用性有限。
3. 推断局域网网关IP特征
UniFi网关默认管理IP多为192.168.1.1或192.168.0.1,可通过WebRTC获取局域网IP,尝试访问该IP管理页面并判断内容特征:
async function detectUniFiGatewayIP() { return new Promise(resolve => { const pc = new RTCPeerConnection({ iceServers: [] }); pc.createDataChannel(''); pc.createOffer().then(offer => pc.setLocalDescription(offer)); pc.onicecandidate = (e) => { if (!e.candidate) return; const ipMatch = e.candidate.candidate.match(/([0-9]{1,3}\.){3}[0-9]{1,3}/); if (!ipMatch) { pc.close(); resolve(false); return; } const localIP = ipMatch[0]; // 匹配UniFi常见默认IP段 if (!localIP.startsWith('192.168.') || !(localIP.endsWith('.1.1') || localIP.endsWith('.0.1'))) { pc.close(); resolve(false); return; } // 尝试加载网关管理页面(受跨域限制,仅能做基础判断) const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = `http://${localIP}`; iframe.onload = () => { let isUniFi = false; try { isUniFi = iframe.contentDocument.title.includes('UniFi') || iframe.contentDocument.body.innerText.includes('Ubiquiti'); } catch (err) { // 跨域无法读取内容,基于IP特征做推断 isUniFi = true; } document.body.removeChild(iframe); pc.close(); resolve(isUniFi); }; iframe.onerror = () => { document.body.removeChild(iframe); pc.close(); resolve(false); }; document.body.appendChild(iframe); }; }); } // 使用示例 detectUniFiGatewayIP().then(isUniFi => { if (isUniFi) { // 展示指导方案 } });
局限性:WebRTC获取的IP不一定是网关,跨域限制导致无法准确读取管理页面内容,容易误判其他使用相同默认IP的网关。
重要说明
所有间接检测方法都无法100%准确识别UniFi网关,建议在检测后同时提供通用故障排查方案,避免仅依赖设备检测结果。
内容的提问来源于stack exchange,提问作者Simon Ferndriger
相关产品推荐
相关产品推荐

