Nginx 配置我应该拒绝缺少 accept 标头的请求吗

Nginx 配置我应该拒绝缺少 accept 标头的请求吗

因此,我会阻止缺少/为空的请求用户代理标题,因为没有理由用户代理不应存在​​或为空,因为所有合法浏览器和机器人(googlebot 等)都会发送该标头。

##If the user agent is missing empty or contains just a single hyphen.
if ($http_user_agent ~ "^-?$") {
return 403;
}

从我的研究来看接受标头应始终存在,即使为空也应发送。标头不应缺失。

但在拒绝不发送接受标头我想验证它不会产生不良影响,我看到 modsecurity 和其他几个人(不太确定 OWASP)说至少应该存在 accept 标头。(据我所知,只要标头存在于请求中并且没有丢失,就应该发送并允许访问。)

我为 Nginx 制定了以下规则,但尚未将其投入生产使用,因为我需要更多有关该标头是否应该丢失的信息。

## Prevent Missing Accept header
set $block_missing_accept_header 0;
#If Accept header present
if ($http_accept) {
set $block_missing_accept_header 1;
}
#Header was missing so deny request
if ($block_missing_accept_header = 0) {
return 403;
}

答案1

该规则是我的想法,因此以下是我的想法。

通过大量请求样本,我发现实际的 Web 浏览器(IE、Firefox、Chrome、Konqueror、Opera 等)始终会发送 Accept 标头。但机器人并不总是这样做,这取决于 HTTP 库、程序员的能力等多种因素。

然后,机器人佯装带有伪造 User-Agent 字符串的 Web 浏览器有时会缺少 Accept 标头。

因此,这里的想法是抓住那些假装是网络浏览器并且表现不佳的机器人,通过不发送 Accept 标头。

要实施此规则,您必须检查 User-Agent 字符串是否以“Mozilla”开头。除非满足以下两个条件,否则不适合进行阻止:用户代理声称是 Web 浏览器,并且缺少 Accept 标头。

if ($http_user_agent ~ ^Mozilla) {
    set $block_missing_accept_header "Mozilla";
}
if ($http_accept = false) {
    set $block_missing_accept_header "${block_missing_accept_header}NoAccept";
}
if ($block_missing_accept_header == "MozillaNoAccept") {
    return 403;
}

答案2

我认为应该阻止没有用户代理的客户端。

  • 所有合法的 robots 请求都有一个 HTTP 用户代理字段:googlebot、bing、baidu...
  • 所有已知的合法 SEO 机器人请求都有一个 HTTP 用户代理:moz、majestic、semrush……
  • 所有合法的浏览器请求都有一个 HTTP 用户代理:Chome、Edge、Brave、Mozilla……
  • Linux 命令默认添加用户代理:curl、kurly

相关内容