网站安全加固:优化 Nginx 安全头配置

在现代 Web 开发中,确保网站的安全性至关重要。Nginx 提供了多种安全头来增强网站的安全性。本文将介绍如何配置关键的安全头来提高网站的安全性。

1. HTTP 301 重定向到 HTTPS

为了确保所有流量都通过 HTTPS 传输,我们需要将 HTTP 请求重定向到 HTTPS。如果你的站点不是 https,则可以忽略该配置。

bash 复制代码
server {
    listen 80;
    server_name example.com;

    # 将所有 HTTP 请求永久重定向到 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    # SSL 配置
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/privatekey.pem;

    # 其他配置...
}

2. 配置响应头进行安全加固

下面是配置一些响应安全头,提高网站安全性的一个 Nginx 配置示例:

bash 复制代码
server {
    # listen、server 等前置配置...

    # 设置默认response的安全头(http和https站点通用)
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Frame-Options SAMEORIGIN;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; frame-ancestors 'self'; object-src 'none';";
    # 下面两个header用于https站点
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    add_header Referrer-Policy "no-referrer-when-downgrade";

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    # 其他配置...
}

2.1. Strict-Transport-Security (HSTS)

Strict-Transport-Security 头用于强制浏览器仅通过 HTTPS 协议与服务器通信,即使用户输入的是 HTTP URL。

bash 复制代码
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
  • max-age=31536000: 浏览器在 31536000 秒(即一年)内记住该域名应该只通过 HTTPS 访问。
  • includeSubDomains: 该 HSTS 策略不仅适用于主域名,还适用于所有子域名。

2.2. Referrer-Policy

Referrer-Policy 头用于控制浏览器如何发送 Referer 头信息。

bash 复制代码
add_header Referrer-Policy "no-referrer-when-downgrade";
  • no-referrer-when-downgrade : 在请求降级时(例如从 HTTPS 到 HTTP),不会发送 Referer 头。但在同源或更高安全级别的请求中,会发送完整的 Referer 头。

2.3. X-Content-Type-Options

X-Content-Type-Options 头用于防止浏览器对响应内容进行 MIME 类型嗅探。

bash 复制代码
add_header X-Content-Type-Options nosniff;
  • nosniff: 强制浏览器按照 Content-Type 头指定的 MIME 类型来解析内容,而不进行猜测。

2.4. X-XSS-Protection

X-XSS-Protection 头用于启用浏览器的跨站脚本(XSS)过滤功能。

bash 复制代码
add_header X-XSS-Protection "1; mode=block";
  • 1; mode=block: 启用 XSS 过滤器,并在检测到潜在的 XSS 攻击时阻止页面加载。

2.5. X-Frame-Options

X-Frame-Options 头用于防止点击劫持攻击,通过限制页面是否可以被嵌入到其他页面的 <frame><iframe><object> 中。

bash 复制代码
add_header X-Frame-Options SAMEORIGIN;
  • SAMEORIGIN: 只允许页面在同一域名下被嵌入。

2.6. Content-Security-Policy (CSP)

Content-Security-Policy 头用于防止跨站脚本攻击(XSS)和其他代码注入攻击。

bash 复制代码
add_header Content-Security-Policy "default-src 'self' data:; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'self'; object-src 'none';";

示例中给出的是一些常用的 CSP 指令,实际上还有更多的指令选项,具体请自行查阅。当然也可以在浏览器 Console 中查看报错内容,并添加相应的 CSP 指令。

  • default-src 'self': 允许从同一来源加载所有资源。
  • script-src 'self': 允许从同一来源加载脚本。
  • style-src 'self': 允许从同一来源加载样式表。
  • img-src 'self' data:: 允许从同一来源加载图像,并允许使用 Data URLs。
  • font-src 'self' data:: 允许从同一来源加载字体,并允许使用 Data URLs。
  • connect-src 'self': 允许从同一来源发起连接。
  • frame-ancestors 'self': 允许仅在同源页面中嵌入当前页面。
  • object-src 'none': 禁止加载任何对象。
  • 其他更多......

default-src 是一个通用设置,用于为所有未显式指定源的指令提供默认的来源策略。例如你确定所有的资源都是 'self' data:,那么可省略其他配置简化设置为 Content-Security-Policy: default-src 'self' data:;

下面示例是添加例外站点,以 "允许从 https://trusted.cdn.com 加载脚本" 为示例配置如下:

bash 复制代码
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'self'; object-src 'none';";

分号分隔了多种不同类型加载限制,每种类型都可以单独配置例外的站点,均可以配置多个例外站点。

总结

通过配置这些安全头,您可以显著提高网站的安全性。

其中,以下四个头适用于 HTTP 和 HTTPS 站点:

  • X-Content-Type-Options
  • X-XSS-Protection
  • X-Frame-Options
  • Content-Security-Policy

以下两个头特定于 HTTPS 站点:

  • Strict-Transport-Security
  • Referrer-Policy

(END)

相关推荐
QT.qtqtqtqtqt17 分钟前
未授权访问漏洞
网络·安全·web安全
ba_pi3 小时前
每天写点什么2026-02-04(2.1)信息安全
安全·web安全
枷锁—sha3 小时前
Burp Suite 抓包全流程与 Xray 联动自动挖洞指南
网络·安全·网络安全
菩提小狗4 小时前
小迪安全2023-2024|第5天:基础入门-反弹SHELL&不回显带外&正反向连接&防火墙出入站&文件下载_笔记|web安全|渗透测试|
笔记·安全·web安全
Mintopia5 小时前
Web 安全与反编译源码下的权限设计:构筑前后端一致的防护体系
前端·安全
Mintopia5 小时前
Web 安全与反编译源码下的权限设计:构建前后端一体的信任防线
前端·安全·编译原理
天若有情6736 小时前
【自研实战】轻量级ASCII字符串加密算法:从设计到落地(防查岗神器版)
网络·c++·算法·安全·数据安全·加密
darkb1rd7 小时前
七、PHP配置(php.ini)安全最佳实践
安全·php·webshell
全栈工程师修炼指南7 小时前
Nginx | stream content 阶段:UDP 协议四层反向代理浅析与实践
运维·网络·网络协议·nginx·udp
鹏北海8 小时前
micro-app 微前端项目部署指南
前端·nginx·微服务