Nginx 防御 Host 头攻击:四种主要的配置思路

更新日期: 2025-12-02 阅读: 206 标签: Nginx

Nginx严格校验HTTP Host头是防范利用伪造域名进行恶意跳转、钓鱼等攻击的关键防线。下表为你概括了四种主要的配置思路,方便你快速理解核心区别并选择。

方案核心思路适用场景推荐度关键代码
变量标志位使用$flag变量绕开if限制,精准匹配推荐作为首选方案,逻辑清晰安全⭐⭐⭐⭐⭐if ($host == "fly63.com") { set $flag 1; }
多域名支持扩展标志位法,允许多个合法域名主站、子站、测试环境共存⭐⭐⭐⭐多个if ($host == "域名")并列
正则匹配单行正则表达式匹配或拒绝需要匹配动态或IP段等复杂模式⭐⭐⭐if ($http_host !~* "^合法域名或IP正则$") { return 403; }
Server块匹配利用Nginx原生机制,非法Host由默认块处理最简单的“非白即黑”式防护⭐⭐⭐⭐server { listen 80 default_server; return 444; }

方案详解与配置

你可以根据需求直接选用或组合使用以下方案:

1. 变量标志位方案(推荐)
这是最稳健的方案,它通过在Nginx中设置一个$flag变量,巧妙地规避了Nginx if指令的限制,实现精确匹配。

server {
    listen 80;
    server_name fly63.com;

    # 核心防护逻辑:初始化标志位
    set $flag 0;
    # 仅当Host头完全匹配预设域名时,标志位设为1
    if ($host == "fly63.com") {
        set $flag 1;
    }
    # 标志位仍为0,说明Host非法,拦截
    if ($flag = 0) {
        return 403;
    }

    location / {
        # 你的正常配置
        proxy_pass http://backend;
    }
}

2. 支持多域名场景
如果服务需要支持多个合法域名(如主站、子站、本地环境),可以轻松扩展标志位方案。

set $flag 0;
if ($host == "fly63.com") { set $flag 1; }
if ($host == "api.fly63.com") { set $flag 1; }
if ($host == "localhost") { set $flag 1; }
if ($flag = 0) {
    return 403;
}

3. 正则匹配方案(需谨慎)
当需要匹配一类模式(如所有子域名、特定IP段)时,可以考虑正则匹配。但务必谨慎使用,因为复杂的正则容易出错且性能略低。

# 示例:允许所有以.fly63.com结尾的域名
if ($http_host !~* "^(.+\.)?xlsys\.cn$") {
    return 403;
}

4. Server块匹配方案(原理性方案)
这个方案利用了Nginx处理请求的核心机制:一个请求会寻找与之Host头匹配的server块,如果没有匹配项,则由标记为default_server的块处理。我们只需让默认块拒绝请求即可。

# 1. 为你的服务配置特定server块
server {
    listen 80;
    server_name fly63.com; # 你的合法域名
    # ... 你的正常业务配置
}

# 2. 设置一个默认server块,拒绝所有不匹配的请求
server {
    listen 80 default_server;
    # 返回444会直接关闭连接,不发送任何响应头,更安全
    return 444; # 或 return 403;
}

防护验证与最佳实践

配置完成后,强烈建议使用curl命令验证规则是否生效:

# 测试1:使用合法Host头,应成功访问(或返回正常页面)
curl -H "Host: fly63.com" http://你的服务器IP/

# 测试2:使用伪造的非法Host头,应返回403 Forbidden
curl -H "Host: evil.com" http://你的服务器IP/

更进一步的最佳实践建议:

  • 后端代码不要依赖Host头:这是根本。生成链接、重定向时,应使用配置文件中的固定域名,而不是从Host头读取。

  • 记录攻击日志:在拦截时可以记录日志,便于后续分析。

    nginx
    if ($flag = 0) {
        access_log /var/log/nginx/host_attack.log;
        return 403;
    }
  • HTTPS同样需要配置:如果你的服务监听443端口,请务必在对应的server块中添加同样的防护规则。


总结

总的来说,防御Host头攻击的关键在于:在Nginx入口处建立一道严格的白名单过滤机制

  • 对于绝大多数场景,首选“变量标志位”方案,它安全、清晰。

  • 如果需要支持多个固定域名,使用其扩展的多域名支持方案

  • 利用 default_server块返回444 是一个优秀的、原理性的补充防御措施,可以捕获所有“漏网之鱼”。

  • 谨慎使用正则匹配方案,仅在确实需要灵活匹配模式时考虑。

请注意,以上配置是第一道防线。安全的纵深防御原则要求后端应用自身也绝不能信任Host头,应使用可信的配置来构建绝对URL。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13262

相关推荐

前端如何通过Nginx代理做到跨域访问API接口

Nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url

nginx找不到js css文件怎么办

js、css都算静态资源,之所以请求不到是因为nginx做代理后的虚拟路径和静态资源的请求路径不一致导致的。只需要更改root的配置就可以了。

nginx去掉url中的index.php

使用情境:我想输入www.abc.com/a/1后,实际上是跳转到www.abc.com/index.php/a/1,配置Nginx.conf在你的虚拟主机下添加:如果你的项目入口文件在一个子目录内,则.

Nginx配置https和wss

常见的服务器有三种:Nginx、IIS、Apache,都可以配置https,但是没必要全部知道,因为Nginx可以起到反向代理的作用,会配置Nginx就足够了。在/etc/nginx/conf.d目录下新建https.conf

nginx做http向https的自动跳转

首先让nginx服务器监听两个端口,分别是80端口和443端口,注意监听443端口的时候需要配置证书的认证以及创建自签名证书!关于证书的认证的以及创建自签名的证书,nginx的配置如下,只给出了两个server的配置,可以直接复制到http块中。

Nginx解析PHP的原理 | CGI、FastCGI及php-fpm的关系

php-fpm采用master/worker架构设计, master进程负责CGI、PHP公共环境的初始化及事件监听操作。worker进程负责请求的处理功能。在worker进程处理请求时,无需再次初始化PHP运行环境,这也是php-fpm性能优异的原因之一

nginx自定义变量与内置预定义变量

nginx可以使用变量简化配置与提高配置的灵活性,所有的变量值都可以通过这种方式引用:$变量名,而nginx中的变量分为两种,自定义变量与内置预定义变量

总结nginx中的location配置

Location指令是nginx中最关键的指令之一,location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。

nginx 配置proxy_pass URL末尾加与不加/(斜线)的区别

nginx在配置proxy_pass的时候 URL结尾加斜线(/)与不加的区别和注意事项,加/斜线的情况;不加/斜线的情况

Nginx 禁止某 IP 访问

总有一些不怀好意的人来访问我的网站,而且频率还很高,所以就用简单的方式禁止访问,就用 Nginx 来实现。想要添加黑名单,只要在 blocksip.conf 中添加 IP ,然后 reload 即可。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!