沙滩星空的博客

title HTTP 请求头在网络攻防中的应用详解

AI Prompt

深度解说下HTTP请求头在网络安全防护(蓝队防守方)和网络数据爬虫防反扒(红队攻击方)中起到的作用。要详细到不同请求头可能的不同取值的含义。重点阐述sec-开头的请求头。
包括但不限于:
Sec-Fetch-*详细展开说
sec-ch-ua*详细展开说
priority详细展开说
referer
accept
accept-language
user-agent:本来以为只是浏览器型号,实践发现连手机型号信息也带进来了。

HTTP请求头

HTTP请求头在网络安全和数据爬虫领域扮演着双重角色:对于蓝队(防守方),它们是识别恶意请求、加固应用安全的关键线索;对于红队(爬虫开发者),它们是模拟合法流量、规避检测的核心工具。下面详细解析几类重要的请求头及其不同取值在攻防两端的含义与策略。

请求头蓝队防守视角(防护重点)红队攻击视角(伪装要点)
Sec-Fetch-Site识别请求来源关系,重点监控 cross-site,防范 CSRF 等跨站攻击。通常无法伪造,需使爬虫行为产生的该头值符合“预期”(如同源 same-origin)。
Sec-Fetch-Mode识别请求模式,对非简单请求(如 cors)加强合法性校验。根据请求目的设置,如获取数据为 cors,导航页面为 navigate。
Sec-Fetch-Dest校验资源使用目的,异常组合(如 Dest 为 script 但 URL 为图片)可能是攻击征兆。根据期望返回的数据类型设置,如请求 HTML 页面应为 document。
Sec-Fetch-User验证关键操作(如支付)是否由真实用户主动触发(?1)。非导航请求通常不携带,对大多数爬虫场景影响较小。
Sec-CH-UA-*用于设备指纹识别,辅助判断客户端环境的真实性。需保持一套指纹信息在不同请求间的一致性,避免自相矛盾。
Priority异常优先级可能指示恶意扫描或资源耗尽攻击。通常使用浏览器常见优先级(如 high 用于关键 CSS/JS)避免特立独行。
Referer验证来源页是否在白名单内,空值或异常域可能是 CSRF 或直接访问。为请求链设置合理且存在的 Referer,如从 A 页跳到 B 页,Referer 应为 A。
User-Agent检测可疑或过时的 UA 字符串,但其易伪造,不可单独作为信任依据。使用常见、更新的真实浏览器 UA 字符串,并可随机轮换以规避频率封禁。

🔍 Sec-Fetch-* 请求头详解

这是一组由浏览器自动添加、不可被前端 JavaScript 篡改的请求头,为服务器提供了关于请求上下文的宝贵“元数据”。

  • Sec-Fetch-Site:表明请求发起源与目标源的关系。

    • same-origin:同源请求。防守方通常认为是相对安全的。
    • same-site:同站但不同源(如 a.example.com 请求 b.example.com)。防守方需结合其他策略判断。
    • cross-site:跨站请求。防守方需高度警惕,可能是正常的 CDN 资源加载,也可能是 CSRF 攻击。
    • none:用户直接触发的导航(如地址栏输入、书签打开)。防守方通常认为是安全的。
  • Sec-Fetch-Mode:表明请求的模式。

    • navigate:普通的页面导航请求。防守方重点检查是否为 GET 方法。
    • cors:跨域请求。防守方需检查 Origin 头并正确设置 CORS 策略。
    • no-cors:通常用于加载跨域图片、脚本等,不需要服务器返回 CORS 头。防守方风险较低。
    • same-origin:同源请求。防守方风险较低。
  • Sec-Fetch-Dest:表明请求的目的地,即期望的响应数据类型。

    • document:请求 HTML 文档。
    • script:请求 JavaScript 文件。
    • image:请求图片资源。
    • empty:如由 fetch() API 发起且未明确指定的请求。防守方需结合其他上下文判断。
  • Sec-Fetch-User:表明一个导航请求是否由用户主动触发。

    • ?1:由用户激活触发(如点击链接)。对于关键操作,防守方应要求此值为 ?1。
    • 非导航请求不携带此头。

蓝队防护策略示例:拒绝处理明显不合理的请求组合。例如,Sec-Fetch-Dest 为 image 但请求 URL 是返回 JSON 的 API 接口,应当拦截。

📱 Sec-CH-UA-* 与客户端指纹

这组头提供了更详细的用户客户端信息,用于替代传统的 User-Agent 字符串,格式更结构化。

  • Sec-CH-UA:提供浏览器品牌、主要版本信息。例如:"Chromium";v="104"。
  • Sec-CH-UA-Mobile:表明是否移动设备。?1 为是,?0 为否。
  • Sec-CH-UA-Platform:提供操作系统信息,如 "Windows", "Android"。
  • Sec-CH-UA-Full-Version-List 等:提供更详细的版本列表,用于更精确的指纹识别。

攻防要点:红队需保持信息一致性(如移动端标识与 UA 匹配)。蓝队可将此作为设备指纹识别和异常客户端检测的重要依据。

🌐 其他关键请求头

  • Referer:指示请求的来源页面 URL。

    • 蓝队防守:用于防盗链、简单 CSRF 校验和来源分析。但不可单独依赖,因其可被伪造或为空。
    • 红队攻击:需要构建合理的请求来源链。例如,要请求 B 页面,应先请求 A 页面,再从 A 链接到 B,使 B 请求的 Referer 为 A。
  • User-Agent:提供浏览器、操作系统、设备型号等详细信息。

    • 蓝队防守:用于识别爬虫、旧版本浏览器或扫描工具特有的 UA 字符串。但其极易伪造,防御价值有限。
    • 红队攻击:必须设置常见且更新的 UA。进阶技巧是使用 UA 池轮换,避免因单一 UA 高频请求而被封禁。
  • Priority(或 Sec-Priority):暗示浏览器对该请求的优先级评估。

    • 常见值如 high(关键资源,如首屏 CSS)、low(低优先级资源,如图片)。
    • 蓝队防守:可用于监控异常行为。例如,爬虫可能对所有请求都设置为 high,此模式可作为检测线索。
    • 红队攻击:通常无需特别设置,使用浏览器默认行为即可。过度设置反而可能画蛇添足。

💎 总结与核心策略

  • 对于蓝队(防守方):切勿信任任何由客户端直接提供的数据。应将 Sec-Fetch-* 等不可伪造的元数据作为首要防线。将传统请求头作为辅助验证,并结合服务端会话管理、CSRF Token 等机制构成纵深防御体系。
  • 对于红队(攻击方/爬虫方):核心在于 “逼真”。爬虫发出的每一个请求,其所有头部信息构成的整体画像,都应与真实浏览器行为无异。需要深入理解每个头的含义,使用动态、随机的 UA,构建合乎逻辑的请求序列和 Referer 链。
最近更新: 2025/10/31 10:04
Contributors: Hankin