一、事件背景

A域名接入了动态防护(Bot 防护、反爬虫机制),同时第三方业务B域名通过内嵌iframe的方式调用了A域名下的一个链接。

二、动态防护介绍:

动态防护(也称为 Bot 防护、反爬虫机制)是网站为了防止自动化程序(如爬虫、恶意脚本)大规模访问而采取的一种安全措施。通过先返回一段 JS 代码到客户端执行,然后生成 Cookie就是其中一种非常典型的 客户端验证机制


🔍 原理详解:为什么需要执行 JS 来生成 Cookie?

🧠 核心思想:

服务器通过检测客户端是否具备完整的浏览器环境来判断是否为真人或自动化工具(如爬虫、Selenium 等)。如果直接请求页面,没有执行 JS,就说明不是真正的浏览器行为,可能是机器。


✅ 典型流程如下:

  1. 首次请求

    • 客户端(比如浏览器或爬虫)向服务器发送 HTTP 请求。
    • 服务器识别到这不是一个具有完整 JavaScript 执行能力的浏览器(比如没有 session 或者 cookie),于是不返回真实内容。
  2. 返回一段 JS 代码

    • 服务器返回一个 HTML 页面,里面包含一小段 JavaScript 脚本,这段脚本通常会:
      • 计算一些随机值
      • 设置 document.cookie
      • 或者重定向到某个带 token 的 URL
  3. JS 在浏览器中执行

    • 浏览器执行这段 JS,生成特定的 Cookie(例如 _cf_bm__cfduidchallenge 类似的 cookie)
    • 然后自动发起一个新的请求(可能通过 location.href 或 form.submit()
  4. 第二次请求

    • 新请求带上刚才生成的 Cookie,服务器验证这个 Cookie 是否合法。
    • 如果合法,则放行,返回正常网页内容;否则继续拦截。

🧪 示例:Cloudflare 的挑战机制

以 Cloudflare 的典型 bot 防护为例:

  • 当你第一次访问被保护的网站时,它会返回如下内容:
<html>
<head><title>请等待...</title></head>
<body><script>// 这里是一段混淆过的 JS 代码var s,t,o,p,b,r,e,a,f,i,n, c = document;// ... 一系列复杂计算 ...document.cookie = "cf_clearance=xxx; path=/; expires=...; Secure";location.reload(); // 刷新页面</script>
</body>
</html>
  • 这个 JS 会设置一个叫 cf_clearance 的 Cookie,它是基于时间戳、随机数和哈希算法生成的。
  • 下次请求带上这个 Cookie,服务器验证通过后才允许访问真实内容。

⚠️ 对爬虫的影响

这种机制对传统爬虫(如 requests、urllib)来说是一个重大障碍,因为它们无法执行 JavaScript,也就无法生成所需的 Cookie。

解决方案包括:

方法描述优缺点
使用 Selenium / Playwright模拟真实浏览器可绕过大多数 JS 验证,但资源消耗大
使用 PuppeteerNode.js 控制 Chrome功能强大,但速度慢
逆向工程 JS 逻辑手动提取 JS 生成 Cookie 的逻辑,用 Python 实现效率高,但开发成本高且容易失效
使用第三方服务如 Anti-Captcha、2Captcha、ScraperAPI 等成本较高,但省事

🛡️ 举个小例子(简化版原理)

假设服务器下发以下 JS:

let t = Date.now();
let hash = btoa(t + Math.random());
document.cookie = `my_challenge=${hash}; path=/`;
location.href = '/real-content';

这段 JS 的作用是:

  • 获取当前时间戳
  • 生成一个 base64 编码的 hash
  • 设置成 Cookie
  • 自动跳转到真实页面

服务器收到 /real-content 请求时,检查是否有这个 Cookie,并验证其格式、时效等,如果没问题就放行。


✅ 总结:为什么要执行 JS 来生成 Cookie?

目的说明
区分浏览器和爬虫浏览器能执行 JS,爬虫不能(除非模拟)
防止滥用减少机器人刷接口、刷票、DDoS 攻击等行为
增加爬取成本增加攻击者的逆向难度和维护成本
提升安全性可结合浏览器指纹、TLS 指纹等多维度识别

三、业务适配问题

如果 <iframe> 加载的是不同源的内容,浏览器会实施 同源策略,阻止以下行为:

  • 父页面访问 <iframe> 的 DOM 或执行其中的 JavaScript。
  • <iframe> 访问或修改父页面的内容。

这就导致第三方域名下内嵌的iframe 无法加载动态防护的JS完成检验。

四、解决方案

调整动态防护策略

对来自特定来源的请求放宽限制,如加白调用的IP(IP是固定的)、加白被第三方域名调用的url、放行调用请求的某个特征(如UA、refer 等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88243.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88243.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88243.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 的 Copy 语义:深入浅出指南

在 Rust 中&#xff0c;Copy 是一个关键的特性&#xff0c;它定义了类型的复制行为。理解 Copy 语义对于掌握 Rust 的所有权系统和编写高效代码至关重要。一、核心概念&#xff1a;Copy vs Move特性Copy 类型非 Copy 类型 (Move)赋值行为按位复制 (bitwise copy)所有权转移 (ow…

Qt的信号与槽(二)

Qt的信号与槽&#xff08;二&#xff09;1.自定义槽2.通过图形化界面来生成自定义槽3.自定义信号3.信号和槽带参数4.参数数量5.connect函数的设计&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xf…

Java研学-MongoDB(三)

三 文档相关 7 文档统计查询① 语法&#xff1a; // 精确统计文档数 慢 准 dahuang> db.xiaohuang.countDocuments({条件}) 4 // 粗略统计文档数 快 大致准 dahuang> db.xiaohuang.estimatedDocumentCount({条件}) 4② 例子&#xff1a; // 精确统计文档数 name为奔波儿灞…

TCP协议格式与连接释放

TCP报文段格式 TCP虽然是面向字节流的&#xff0c;但TCP传送带数据单元确是报文段。TCP报文段分为首部和数据段部分&#xff0c;而TCP的全部功能体现在它在首部中各字段的作用。因此&#xff0c;只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。 TCP报文段首部的前20字节是…

CSS05:结构伪类选择器和属性选择器

结构伪类选择器 /*ul的第一个子元素*/ ul li:first-child{background: #0af6f6; }/*ul的最后一个子元素*/ ul li:last-child{background: #d27bf3; } /*选中p1&#xff1a;定位到父元素&#xff0c;选择当前的第一个元素 选择当前p元素的父级元素&#xff0c;选中父级元素的第…

使用策略模式 + 自动注册机制来构建旅游点评系统的搜索模块

✅ 目标&#xff1a; 搜索模块支持不同内容类型&#xff08;攻略、达人、游记等&#xff09;每种搜索逻辑用一个策略类表示自动注册&#xff08;基于注解 Spring 容器&#xff09;新增搜索类型时&#xff0c;只需添加一个类 一个注解&#xff0c;无需改工厂、注册表等&#x…

第八十九篇 大数据开发中的数据算法:贪心策略 - 生活中的“精打细算”艺术

在资源有限的世界里&#xff0c;贪心算法教会我们&#xff1a;局部最优的累积&#xff0c;往往是通往全局最高效的捷径。本文通过3个生活化场景原创图表&#xff0c;揭示大数据开发中最实用的优化策略。目录一、贪心算法核心思想&#xff1a;当下即最优二、三大核心应用场景详解…

【论文阅读】Dynamic Few-Shot Visual Learning without Forgetting

系统概述如下: (a) 一个基于卷积神经网络(ConvNet)的识别模型,该模型包含特征提取器和分类器; (b) 一个少样本分类权重生成器。这两个组件都是在一组基础类别上训练的,我们为这些类别准备了大量训练数据。在测试阶段,权重生成器会接收少量新类别的训练数据以及基础类别的…

HTML应用指南:利用GET请求获取全国山姆门店位置信息

山姆会员店作为全球知名的零售品牌&#xff0c;自进入中国市场以来&#xff0c;始终致力于为消费者提供高品质商品与便捷的购物体验。随着新零售业态的快速发展&#xff0c;门店位置信息的获取变得愈发重要。品牌通过不断拓展门店网络&#xff0c;目前已覆盖多个一、二线城市&a…

java ThreadLocal源码分析

写个demo测试下&#xff1a;private static void testThreadLocal() {ThreadLocal<Integer> threadLocal new ThreadLocal<>();new Thread(){Overridepublic void run() {threadLocal.set(9527);System.out.println("curr thread: " Thread.currentThr…

后端Web实战(项目管理)

Restful风格 我们的案例是基于当前最为主流的前后端分离模式进行开发 在前后端分离的开发模式中&#xff0c;前后端开发人员都需要根据提前定义好的接口文档&#xff0c;来进行前后端功能的开发。 后端开发人员&#xff1a;必须严格遵守提供的接口文档进行后端功能开发&#…

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph 1. 解题思路2. 代码实现 题目链接&#xff1a;3604. Minimum Time to Reach Destination in Directed Graph 1. 解题思路 这一题思路上就是一个广度优先遍历&#xff0c;我们不断考察当前时间点以及位置…

OpenXR Runtime切换工具-OpenXR-Runtime-Switcher

在开发VR时&#xff0c;有时有多个设备&#xff0c;大家可能也会选择不同的串流工具&#xff0c;OpenXR类似于默认浏览器&#xff0c;如果设置错误可能导致游戏无法串流。 推荐一个工具&#xff0c;可以设置默认的OpenXR工具。 OpenXR-Runtime-Switcher 对于没有的设备&#…

Opencv探索之旅:从像素变化到世界轮廓的奥秘

在你已经能熟练地为图像施展“降噪”、“缩放”等魔法之后&#xff0c;你的探索之旅来到了一个全新的领域。你可能会好奇&#xff1a;我们人类能轻易地识别出照片中杯子的边缘、建筑的轮廓&#xff0c;那计算机是如何“看见”这些边界的呢&#xff1f;仅仅依靠滤波和颜色变换&a…

Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南

背景场景 在 Ubuntu 系统中使用 apt 或 deb 包方式安装 MySQL 8 时&#xff1a; 初次安装后会自动初始化数据库&#xff1b;但 没有提示 root 初始密码&#xff1b;导致 mysql -u root -p 无法登录。 为了解决该问题&#xff0c;通常我们使用 --skip-grant-tables 方式跳过权限…

题解:P13017 [GESP202506 七级] 线图

首先明白定义&#xff1a; 线图 L(G)L(G)L(G) 的顶点对应原图 GGG 的边&#xff0c;当且仅当原图中的两条边有公共顶点时&#xff0c;对应的线图顶点之间有一条边。 不难想到&#xff0c;对于原图中的每个顶点 vvv&#xff0c;其度数 d(v)d(v)d(v) 对应的边集可以形成 (d(v)2)\…

c++ duiLib环境集成2

继续上一篇&#xff0c;现在需要把控制台隐藏&#xff0c;只显示调用duiLib框架显示的窗口。右键项目 → 属性 → 链接器 → 系统 → ‌子系统‌改为 窗口(/SUBSYSTEM:WINDOWS)。原来是这样&#xff1a;修改为&#xff1a;运行报错&#xff1a;需要修改入口函数为WinMain。如下…

常见的网络攻击方式及防御措施

常见的网络攻击方式及防御措施&#xff1a;全面解析网络安全威胁 前言肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱在信息化高速发展的今天&#xff0c;网络安全威胁无处不在&#…

JavaScript 中导入模块时,确实不需要显式地写 node_modules 路径。

1. 正确的导入语法在 Webpack、Vite 等打包工具中&#xff0c;node_modules 目录是默认的模块搜索路径&#xff0c;因此直接写包名即可&#xff1a;// ✅ 正确&#xff1a;直接使用包名import nprogress/nprogress.css;// ❌ 错误&#xff1a;不需要显式写 node_modules 路径im…

ELK Stack技术栈

文章目录一、日志收集所解决的问题二、Elastic Stack 组件介绍2.1 Elasticsearch2.2 Logstash2.3 Kibana2.4 Filebeat beats三、ELK Stack集群安装3.1 安装JAVA环境&#xff08;所有ES节点&#xff09;3.2 安装ES集群3.2.1 ES单节点部署3.2.2 ES JAVA调优&#xff1a;堆(heap)内…