在现代 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)