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

更新日期: 2025-12-02 阅读: 12 标签: 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常用配置--nginx之proxy_pass代理后端https请求完全解析

前提条件:nginx源码或nginx plus源码、一个代理服务器或一个代理服务器组、SSL证书和私钥,你可以从一个可信任证书颁发机构(CA)购买一个服务器证书,或者你可以使用openssl库创建一个内部CA签名

nginx:支持https

查看nginx模块,如果看到with-ssl那就是有的。注册ssl证书并下载,配置nginx就比如说,还没有配置https前你配置了80,那么你http://域名/直接默认访问80端口,那么一样的

nginx做http向https的自动跳转

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

Nginx配置https和wss

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

nginx加速_开启Gzip/文件做缓存

开启Gzip:给Nginx上 ngx_http_gzip_module 这个模块,用 nginx -V 命令查看 configure arguments 是否有,没有的话需要编译加载这个模块;给文件做缓存:图片文件,字体文件,js和css都是些可以用来缓存的文件

nginx和php-fpm的进程启停重载总结

ginx和php-fpm对于-USR2、-HUP信号的处理方式不一样:TERM, INT(快速退出,当前的请求不执行完成就退出),QUIT (优雅退出,执行完当前的请求后退出)

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

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

Nginx 禁止某 IP 访问

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

Nginx服务器 之反向代理与负载均衡

客户端就可以通过请求代理服务器,获取想要的资源,但客户端并不知道给他资源的是哪个服务器。这种方式就是反向代理。当一台服务器的单位时间内的访问量越大的时候,服务器的压力会越大。我们通常通过负载均衡的方式来分担服务器的压力。

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

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

点击更多...

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