微软的人机验证
点两次按钮,或长按按钮
微软的人机验证PerimeterX/HUMAN,大量使用多层iframe嵌套,隐藏多个iframe显示一个有用的,使用 Shadow DOM (影子 DOM)。
1. Shadow DOM(影子 DOM)
- ShadowRoot:影子根(devtools 里显示
#shadow-root)
- Shadow Tree:影子树(内部整套隔离 DOM)
- Shadow Host:承载影子 DOM 的外层普通元素(host 宿主)
特征(PerimeterX 人机验证大量使用)
- 挂在普通 DOM 元素内部,不在主 DOM 树直接展示,肉眼看页面上存在,但控制台直接查 document 找不到;
- 自带隔离边界,CSS、DOM 查询默认穿透不进去;
- showdom 探针会递归检测页面所有
shadowRoot,校验是否被自动化篡改、隐藏、强行注入节点;
- 多层 iframe 内部再嵌套 shadow-root,是微软 HUMAN 验证的标准结构。
俗称:影子 DOM、虚拟 DOM 树、shadow 根。
2. 容易混淆的另一个:Virtual DOM(虚拟 DOM)
前端框架 React/Vue 内存里的 JS 对象树,浏览器原生不存在,只是内存数据,和页面渲染隔离无关,PerimeterX 不检测这个,基本不是你要找的。
3. iframe 本身不是虚拟元素
iframe 是独立完整文档,属于嵌套文档沙箱,和 shadow DOM 是两层隔离:
多层 iframe + 每层内部带 shadow-root = 微软验证页面典型结构。
二、快速区分(适配你的爬虫 / 自动化场景)
- 你在开发者工具看到
#shadow-root → Shadow DOM / ShadowRoot(影子 DOM)
- React/Vue 源码里的内存 diff 树 → Virtual DOM(虚拟 DOM,和页面检测无关)
- 多层内嵌页面标签
<iframe> → 嵌套框架,独立 window 上下文
三、PerimeterX showdom 对 Shadow DOM 的检测点
- 遍历所有 host 元素读取
.shadowRoot;
- 对比影子树节点数量、尺寸、坐标、可见性;
- 检测是否脚本直接跳过边界操作 shadow 内部按钮;
- 多层 iframe 递归,每层内部再深度遍历 shadow-root,任意一层异常直接拦截。
一句话总结
你要的名词:Shadow DOM(影子 DOM),根节点叫 ShadowRoot。