Skip to content

网道

如何防止非浏览器的访问

参考链接 - https://blog.sicuranext.com/sec-fetch-and-client-hints-a-powerful-tool-against-automation/

利用 Sec-fetch-* 标头识别机器人

正常的请求

Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
  • Sec-Fetch-Dest: documen 是正常的浏览器加载页面,如果是无头浏览器发出的请求,这个字段通常是 empty、script,或者被省略。
  • Sec-Fetch-Mode: navigate 表示这个请求是真实页面浏览触发的,不是脚本触发的。自动化工具的这个字段通常是 no-cors 或 cors。
  • Sec-Fetch-Site: none 表示这是当前网站第一个加载的页面。无头浏览器的这个字段通常设为 cross-site。
  • Sec-Fetch-User: ?1 表示这是真实用户行为触发的。如果是通过 fetch API calls, iframes, images, preloads, passive navigations 等触发的,这个字段就根本没有。

防机器人逻辑

  • 检查 Sec-Fetch-User 标头等于 ?1
  • 检查 Sec-Fetch-Site 标头等于 same-origin 或none
  • 否则,拒绝该请求
1. 允许所有 GET、HEAD 或 OPTIONS 请求。

    这些方法都是[安全的](https://developer.mozilla.org/en-US/docs/Glossary/Safe/HTTP),并且假定不会改变堆栈各层的状态。

2. 如果 Origin 标头与受信任来源的允许列表匹配,则允许该请求。

    应将受信任的来源配置为完整来源(例如`https://example.com`),并通过与标头值简单相等性进行比较。

3. 如果存在 Sec-Fetch-Site 标头:

    1. 如果其值为`same-origin`或`none`,则允许请求;
    2. 否则,拒绝该请求。