能,网站看得到你切换标签页,也看得到你复制和粘贴。不能,它看不到截图、录屏,也看不到你其他标签页里有什么。这两个答案都是真的,所以关于这个话题的每个论坛帖子里,总有一条信誓旦旦的最高赞回复,紧跟着另一条同样信誓旦旦、说法却完全相反的回复。
本页上的小工具就是一个能用的切屏检测器,想在你自己的浏览器上把这场争论一次说清,这是最快的办法。切到另一个标签页,选中并复制一句话,按 Ctrl+P 再取消,然后看看它都记下了什么。
网站能知道你切换了标签页吗?
能。页面被隐藏或重新显示时,浏览器会触发 visibilitychange 事件,并让 document.visibilityState 在 visible 和 hidden 之间切换。窗口失去焦点时,还会另外在 window 上触发 blur 事件。两者都带时间戳,所以页面知道你离开了,也知道离开了多久。统计脚本就靠这个:一个被隐藏的标签页可能再也不会回来,所以那一刻它们会用 navigator.sendBeacon 把收集到的数据发出去。测验平台用的是同样的信号。在开启了测验日志审计的 Classic Quizzes 中,Canvas 会记录学生的测验页面何时失去焦点、何时重新获得焦点。
页面拿不到的是你的去向。在小工具里切走再切回来,日志只会显示你离开了多久,别的什么都没有。这两个事件衡量的也不是同一件事:
- 切换到另一个标签页标签页隐藏: 会上报 失去焦点: 会上报
- 最小化窗口标签页隐藏: 会上报 失去焦点: 会上报
- 点进另一个应用,浏览器仍留在屏幕上标签页隐藏: 无反应 失去焦点: 会上报
- 拿起手机标签页隐藏: 无反应 失去焦点: 无反应
点进某个聊天窗口而浏览器仍留在屏幕上时,只有 blur 会触发,因为标签页依然可见。切换标签页时则两者都会触发。网站就是这样分辨“标签页被隐藏”和“窗口只是失去了焦点”的。光标的移动则是另一个事件:指针移出窗口时会触发 mouseleave,挽留弹窗就靠它在你伸手去点标签栏时拦住你。
机器人往往表现出相反的规律。自动化浏览器经常根本收不到焦点事件,或者报告页面始终处于聚焦状态,我们首页的实时行为监测面板跟踪的正是这种规律。这类信号可以纳入行为评分的权重,也就是你总是碰到的那些验证码背后的同一套评分。
网站能看到你的其他标签页吗?
只能看到它自己的标签页。页面无法列出你的标签页,读不到它们的标题或网址,也看不进它们的内部。同源策略把各个网站彼此隔开,也没有任何 Web API 能枚举标签页。页面能做的,是通过 BroadcastChannel 或 storage 事件,与同一浏览器配置文件里同源的其他标签页通信。应用就是这样发现你把它打开了两次,并问你保留哪一个的。把本页在第二个标签页里再打开一次,“本站的其他标签页”那一行就会把它数进去。
页面能了解到的、关于你此前浏览行为的唯一一件事,是你从哪里来。如果你是点链接过来的,document.referrer 会说出那个链接所在的网站,通常也只有网站名,而不是完整地址。
网站能看到你复制和粘贴的内容吗?
能,但有限度。你按下 Ctrl+C 或使用菜单时,document 上会触发 copy 和 cut 事件,处理函数能准确读到你选中了什么。它还能把别的文字替换进去,这就是有些网站会在你复制的所有内容后面追加“阅读更多……”的做法,一份没人要的“贴心”。你拖选文字的过程中会触发 selectionchange,所以页面在你复制之前就已经知道你选中了什么。
粘贴则是反过来的。往页面里粘贴会触发 paste 并交出剪贴板里的文字,而 beforeinput 会报告文字是键入的还是粘贴的,所以表单能看出你那 400 字的答案是一次性整块贴进来的。页面做不到的,是翻看你的剪贴板。navigator.clipboard.readText() 需要你的授权,并且要求页面正被你使用,所以你在其他应用里复制的文字,在你把它粘贴到某处之前都是私密的。
人们问得最多的,是从 ChatGPT 粘贴过来的文字。页面能看到发生了一次粘贴,以及进来了多少文字。它不会被告知你是从哪个应用或网站复制的,不过富文本格式有时会露出一些线索。
网站能知道你截图或录屏吗?
不能。没有任何浏览器 API 会报告截图或屏幕录制。截图是由操作系统在浏览器之外完成的,不会有任何东西发给页面,无论用的是 OBS、截图工具,还是手机的侧边按键。看起来像截图检测的东西,其实是另外三种情况之一,而最后一种根本不是检测:
- 监听 PrintScreen 的键盘监听器。小工具演示了其中的古怪之处:在 Windows 上,页面通常只能收到按键松开。在 Mac 上,系统会吞掉 Cmd+Shift+4 快捷键,所以页面永远看不到完整的按键过程。
beforeprint监听器。它会在 Ctrl+P 和“另存为 PDF”时触发,所以页面确实能察觉这类副本。- 截图被拦截。流媒体服务的截图里经常是一块黑色矩形,因为视频走的是受保护的通道。这是阻止了捕获,而不是检测到了它。我们的 Widevine DRM 一文讲了这些保护等级是怎么回事。
在手机上,浏览器事件是一样的:切换应用或锁屏时,页面会被隐藏。“网站知道你截了图”这种看法,很可能来自原生应用。iOS 会通知应用你截了屏,Android 从 14 版起也有了面向应用的官方截图回调,聊天应用正是这样告诉对方的。而手机浏览器里的网页,什么都不会被告知。
Canvas 或在线考试能看到你切屏吗?
它能看到失去焦点这件事,带着时间戳,并向老师显示你离开过。但它看不到你去了哪里。对于以网页形式运行的测验,机制就这么多,这也是报告里往往只写“离开了页面”、没有更具体内容的原因。
有监考的考试用的是另一类软件,关于它们“什么都能看到”的说法也在这里最为强硬:
- 你切换了标签页或窗口网页: 能扩展程序: 能原生应用: 部分
- 你还开着哪些其他网站网页: 不能扩展程序: 能原生应用: 部分
- 你的剪贴板里有什么网页: 部分扩展程序: 能原生应用: 能
- 你截了屏网页: 不能扩展程序: 不能原生应用: 部分
- 你正在录屏网页: 不能扩展程序: 不能原生应用: 部分
Respondus LockDown Browser 是安装在电脑上的程序,Proctorio 则是一个有权读取你标签页的浏览器扩展。它们都不受网页能力的约束。如果一场考试似乎比网页知道得更多,请看看它要求你安装了什么。
能阻止网站看到这些吗?
不弄坏页面就做不到,而且常见的变通办法本身就会留下痕迹。伪造这些事件的工具,靠的是替换 document.hidden 的 getter 这类浏览器内置属性和方法,而被替换过的内置接口会暴露自己,方式与机器人检测中隐身补丁暴露自己如出一辙。所以现实的建议很简短:
- 默认页面看得到焦点、可见性和剪贴板事件。 不要去压制它们。真实用户产生的也是同样的事件,伪造它们本身就是破绽。
- 往网站里粘贴之前,先清空剪贴板。粘贴会把整段剪贴板文字交给页面,所以如果你一分钟前复制过密码或助记词,先随便复制点无害的东西把它盖掉。
- 把切换标签页只当作薄弱的证据。它只说明你看向了别处,而这是人们一天到晚都在做的事。因此而扣分的测验或考试网站,是在猜测你的意图。
如果你运营多个账号,一整天都在切换窗口,每个配置文件里的页面都会记录下每一次切换。这没有问题。真正让账号被标记的,是别处的自相矛盾,比如一个配置文件的语言、时钟和 GPU 互相对不上。Incogniton 给每个配置文件配上各自一致的浏览器,这样你的窗口切换看上去就只是再普通不过的日常噪声。平台是否允许多账号,由它自己的规则决定,所以动手之前先弄清楚。
想看看页面还能不经询问就读到哪些东西?完整的浏览器扫描涵盖了网络、硬件和指纹这几个方面。