网站安全加固:优化 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)

相关推荐
墨痕诉清风6 小时前
文件上传漏洞(PDF文件)
安全·web安全·pdf
天天天天学习丶6 小时前
Nginx 域名解析后默认打开其他项目问题解决方案
nginx
Aloudata6 小时前
企业落地 AI 数据分析,如何做好敏感数据安全防护?
人工智能·安全·数据挖掘·数据分析·chatbi·智能问数·dataagent
取谖慕12.6 小时前
keepailved+nginx+nfs高可用
运维·nginx·nfs
张子夜 iiii6 小时前
如何关闭win11系统杀毒软件和防火墙
安全
小Ti客栈6 小时前
Nginx进阶配置实战全攻略:SSL部署、防盗链、压缩、代理、限流、请求合并
nginx·负载均衡·ssl
上海云盾-高防顾问6 小时前
CC攻击的分类与演进:从代理攻击到僵尸网络的技术剖析
网络·安全
雨中飘荡的记忆8 小时前
Spring Security入门:从零开始构建安全应用
java·安全·spring
sunnyday04268 小时前
API安全防护:签名验证与数据加密最佳实践
java·spring boot·后端·安全
会飞的小新8 小时前
Java 应用程序已被安全阻止 —— 原因分析与解决方案
java·安全