返回概览 更多文章

网站能检测到远程桌面吗?对比浏览器暴露的线索

你连上工作电脑,在远程桌面里打开一个网站,却收到了一条警告。网站发现你在用 RDP 了?还是说,它看到的是另一台电脑上运行的浏览器,而这个浏览器的某些特征让它起了疑心?

网站可以读取浏览器暴露的线索,据此推断是否存在远程访问。但下文这些常见的屏幕和图形 API 并不会返回一个“正在使用远程桌面”的会话标志。它们描述的是浏览器环境。商业检测产品宣称能做得更多,而已安装的监控软件又是另一回事。笼统地回答“能”或“不能”,会把最重要的区别抹掉。

简而言之:网页如果运行在远程电脑的浏览器里,读取的就是那个浏览器的环境,而不是直接读取你用来查看远程桌面的笔记本硬件。屏幕尺寸和 GPU 字符串可能变化,但都不能证明 RDP 正在运行。你可以用下方工具对比实际读数;结果只是环境对比,绝不是“存在远程访问”或“不存在远程访问”的证明。

网站读取的是远程电脑上的浏览器

假设你用 MacBook 控制一台 Windows 台式机。如果 Chrome 运行在那台 Windows 电脑上,网页也就在那里执行。MacBook 负责显示桌面、发送操作输入。不会因为你的手指按在 Mac 键盘上,这次访问就变成了来自 Mac 的访问。

Chrome Remote Desktop、AnyDesk 和 TeamViewer 也是同样的起点:先弄清楚运行网页的浏览器在哪。不要把远程桌面客户端和受控桌面里的浏览器混为一谈,哪怕这个客户端本身就是在浏览器里打开的。

网站读取的是哪台电脑?
  1. 你的远程控制端设备显示远程桌面,并发送你的操作输入。
  2. 远程桌面连接在设备之间传输桌面画面和操作输入。
  3. 远程主机上的浏览器运行网页,并响应网页对浏览器 API 的调用。
  4. 网站接收页面信号,以及浏览器发起的网络连接。
普通网页

能读取浏览器暴露的值。这些 API 不提供 RDP 会话标志,也不提供进程列表。

已安装的软件或受管理的软件

代理程序、获授权的扩展或主机管理员可能拥有额外的访问权限。需要单独查看其权限和政策。

关键是浏览器在哪,而不是键盘在哪。这张图描述的是普通远程控制;资源重定向和受管理的集成功能需要另行检查。

这里说的是普通的远程控制模式,不代表所有资源重定向功能都遵循同样的边界。受管理的环境可以重定向资源,也可以把两端设备上的软件集成起来。已安装的代理程序或获得相应权限的扩展,也可能提供普通网页拿不到的信息。如果某项服务要求你安装软件,就需要另行判断它的能力。

网络连接也很重要。在简单的配置中,请求会沿着远程浏览器的网络路由发出。网站看到的是这条连接的出口地址,不会自动看到显示远程桌面的那台笔记本的地址。来自托管网络的 IP 可能引来额外审查,但并不能证明有人在远程控制。我们的 VPN 检测指南讲清了网络信誉与浏览器端线索的区别。

不用远程桌面,也能让环境读数变化

先做一个现在就能复现的对照操作。在下方采集基准值,把浏览器窗口调窄,然后对比。在手机上,旋转屏幕可能更方便。你已经改变了网站能测到的值,却完全没有建立远程会话。

对比浏览器读数,不凭猜测判断远程访问

先采集基准值,再调整浏览器窗口大小或页面缩放,然后进行对比。读数只保存在本组件的内存中,刷新页面就会清除。

目前仅显示当前读数。请先采集基准值。

浏览器环境快照
来源 API基准值当前值对比结果
navigator.userAgent尚未采集等待浏览器加载尚未对比
screen.width / height尚未采集等待浏览器加载尚未对比
screen.availWidth / availHeight尚未采集等待浏览器加载尚未对比
screen.colorDepth / pixelDepth尚未采集等待浏览器加载尚未对比
window.innerWidth / innerHeight尚未采集等待浏览器加载尚未对比
window.devicePixelRatio尚未采集等待浏览器加载尚未对比
UNMASKED_VENDOR_WEBGL尚未采集等待浏览器加载尚未对比
UNMASKED_RENDERER_WEBGL尚未采集等待浏览器加载尚未对比

当前 WebGL 详细信息读取状态: WebGL 详细信息不可用,或浏览器尚未加载。

这个对比无法证明远程桌面是否正在使用。读数相同不代表一定是本地会话;读数变化或不可用也不代表一定是远程会话。

表格读取 navigator.userAgent、screen 的尺寸、可用屏幕区域、颜色深度和像素深度、视口尺寸、devicePixelRatio,以及可选的 WebGL 调试字符串。每个值旁边都标出了对应的 API 名称。这里没有任何一项会枚举已安装的程序或查询 Windows 会话状态。

对比工具本身不会发起网络请求,快照也只保存在组件内存中。刷新页面就会清除基准值。这说的是这个图表,不代表网站上的其他所有功能都离线运行。它不会上传指纹、把结果保存到你的账号,也不会调用反欺诈厂商的服务。

一行标为“相同”,只说明两次可读取的值一致。“已变化”表示值不同。如果某项测量不可用,图表不会把两个缺失值当成相同。它没有红色“检测到 RDP”徽章那么抢眼,但这才是测量结果真正能支持的结论。

屏幕尺寸不是远程桌面的专属特征

screen.width 和 screen.height 返回的是网页可读取的屏幕尺寸,单位为 CSS 像素。window.innerWidth 和 window.innerHeight 描述的则是页面视口。这是两种不同的测量,都不保证等于物理显示器的像素数。

页面缩放也是一个容易踩的坑。正如 devicePixelRatio 文档所解释的,普通页面缩放会影响 DPR,双指缩放则不会。把窗口移到像素密度不同的显示器上,也可能改变它。比例变化证明的是读数变了,不是有人在远程操作。

远程会话可能呈现不同的显示配置,换显示器或调整桌面缩放也可能如此。反过来,某些远程配置也能保留浏览器原本报告的值。只看屏幕读数,你无法判断究竟是哪一种情况。

老式的颜色深度技巧不是 RDP 测试

有些旧回答建议检查 screen.colorDepth 是否低于预期。这既假设浏览器会暴露相关的显示差异,又假设只有远程访问才能造成这种差异。这两个假设都不足以支撑可靠的通用检测。

当前的 CSSOM View 编辑草案描述了这些显示字段,并允许浏览器出于隐私保护返回处理过的屏幕信息。对于颜色深度,它建议在浏览器不知道实际深度,或出于隐私考虑不愿暴露时返回 24。草案还提到了 24 和 32 的兼容性行为。这是一份工作草案,不是 RDP 规范。

所以,“24 代表本地”和“32 代表远程”,都是给真实数字硬贴上的虚构结论。你可以记录这些数字,但换个标签并不会让它们变成确切的会话判断。

软件 GPU 是线索,不能证明存在远程会话

可选的 WEBGL_debug_renderer_info 扩展会暴露供应商和渲染器字符串。Khronos 规范把它们定义为图形驱动信息,并讨论了浏览器可能出于哪些隐私原因不提供这些细节。规范并没有定义远程访问指示器。

软件渲染器告诉你的是浏览器报告的渲染路径,而不是谁在操纵鼠标。也别反过来犯同样的错:读到具体的硬件 GPU 名称,并不能排除远程会话。微软明确提供了通过 RDP 在 Azure Virtual Desktop 中启用 GPU 加速渲染的文档。

我们的 WebGL 指纹详解介绍了这些字符串会透露什么,以及检测工具为什么会误报。图表会说明调试字符串是否成功返回、调试扩展是否不可用,或读取是否失败。其他情况下,它只报告详细信息不可用,不会据此声称 WebGL 上下文本身不存在。它无法查明背后隐藏的原因。

商业远程访问检测产品到底声称能做什么

没有标准标志,不等于“任何网站都不可能检测到远程访问”。PREBYTES 宣传的远程桌面检测产品声称支持在网页中部署 JavaScript,结合主动与被动检测层,并通过 API 报告风险。这些是厂商的说法。我们没有测试过该产品,也没有独立验证其准确率。

商业产品给出的判断,并不等同于读取某一个 screen 属性;这个对比工具也没有复现那款产品,更没有测试行为模型。光标迟缓不能证明存在远程访问,因为延迟还有其他成因。真人通过远程桌面输入,也不等于 Selenium 在驱动浏览器;我们的自动化检测文章讨论的是后一个问题。

改配置之前,先对比自己的环境

如果这是你有权管理和远程访问的电脑,就在那台主机上保持本页打开。先在机器本地采集基准值,再远程连接;如果同一个页面会话还在,就进行对比。如果页面重新加载,基准值就没了;重新测试前,需要自行记录最初的读数。记下所用的客户端、浏览器和显示设置。我们没有亲自运行过这项 RDP 实验,所以这里给出的是测试步骤,不是实测结果。

先在笔记本上打开本页,再到远程主机上打开,是另一种实验:你对比的是两个浏览器环境。出现差异很正常,不能单独认定远程访问就是原因。做记录时,也要把这两件事分清楚。

对于正当的多配置文件 QA 测试,Incogniton 这样的配置文件管理工具或许适合你的工作流程,但它不能证明远程访问无法被检测。遵守服务的远程访问政策,别把任何指纹检测工具的结果当成使用许可。

如果网站拦截了你的工作会话,保存实际警告和前后读数,提供给它的支持团队。然后在那个会话内部的浏览器中运行扫描,而不只是扫描负责显示远程桌面的笔记本。

Incogniton 徽标

提升你的隐私保护

箭头