news 2026/5/1 6:17:44

Nginx 常用安全头

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx 常用安全头

Web 应用中配置 HTTP 安全响应头是提升网站安全性的重要一步。合理配置 Nginx 的安全头,可以抵御常见的安全威胁(如 XSS、点击劫持、MIME 类型嗅探等),增强用户隐私保护和传输安全性。


常见的 HTTP 安全头及其作用

1. Content-Security-Policy (CSP)

作用:限制资源(如脚本、样式、图片等)的加载来源,防止 XSS 和数据注入攻击。

add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none';worker-src blob:;";

配置说明:

  • `default-src ‘self’:限制所有资源的默认加载来源为当前域。
  • script-src 'self':仅允许加载来自当前域的脚本。
  • style-src 'self:限制样式来源为当前域。
  • img-src 'self' data::允许图片来自当前域和data:URI。
  • object-src 'none':禁止加载<object><embed>,防止插件攻击。
  • frame-ancestors 'none':禁止页面被嵌套到其他站点的iframe中。
  • worker-src blob::允许 Web Worker 资源来源为blob:

注意事项:

  • 如果需要加载第三方资源(如 CDN),需显式添加来源。

    script-src ‘self’ https://cdn.jsdelivr.net;

  • 避免使用'unsafe-inline''unsafe-eval',减少 XSS 风险。

  • 使用noncehash机制允许特定的内联脚本:

    add_header Content-Security-Policy “script-src ‘self’ ‘nonce-random123’;”;


2. Strict-Transport-Security (HSTS)

作用:强制浏览器通过 HTTPS 访问网站,防止中间人攻击。

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

配置说明:

  • max-age=63072000:HSTS 有效期(以秒为单位),这里是 2 年。
  • includeSubDomains:对子域名启用 HSTS。
  • preload:允许网站加入 HSTS 预加载列表。

3. X-Frame-Options

作用:防止页面被嵌套到其他站点的iframe中,防止点击劫持攻击。

add_header X-Frame-Options SAMEORIGIN always;

配置说明:

  • SAMEORIGIN:仅允许页面被嵌套到自身域的iframe中。
  • DENY:彻底禁止页面被嵌套。
  • ALLOW-FROM uri:仅允许特定来源嵌套页面(需注意已被部分浏览器废弃)。

4. X-XSS-Protection

作用:启用浏览器的 XSS 过滤功能,防止跨站脚本攻击。

add_header X-XSS-Protection "1; mode=block" always;

配置说明:

  • 1; mode=block:启用 XSS 过滤器并阻止加载恶意脚本的页面。

5. X-Content-Type-Options

作用:防止浏览器对资源类型进行 MIME 嗅探,避免脚本注入攻击。

add_header X-Content-Type-Options "nosniff" always;

配置说明:

  • nosniff:强制浏览器使用Content-Type指定的 MIME 类型。

6. Referrer-Policy

作用:控制Referer头信息的发送,保护用户隐私。

add_header Referrer-Policy "origin" always;

配置说明:

  • origin:跨域请求时仅发送来源站点信息,不包括完整的 URL。

7. Permissions-Policy (原 Feature-Policy)

作用:限制浏览器功能的使用,防止滥用。

add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), fullscreen=(self);";

配置说明:

  • 禁用了地理定位、麦克风、摄像头功能。
  • 仅允许自身域使用全屏功能。

8. Cache-Control 和 Pragma

作用:控制缓存行为,防止敏感数据被缓存。

add_header Cache-Control "no-store" always; add_header Pragma "no-cache" always;

配置说明:

  • Cache-Control: no-store:禁止缓存页面内容。
  • Pragma: no-cache:兼容旧版 HTTP 协议的缓存控制头。

9. Set-Cookie

作用:为 Cookie 添加安全属性,防止 XSS 和中间人攻击。

add_header Set-Cookie "Path=/; HttpOnly; Secure";

配置说明:

  • HttpOnly:防止客户端脚本访问 Cookie,避免 XSS。
  • Secure:仅通过 HTTPS 发送 Cookie。

10. Cross-Origin-Embedder-Policy (COEP)

作用: 限制跨域资源的加载,用于启用跨域隔离。

add_header Cross-Origin-Embedder-Policy "require-corp" always;

配置说明:

  • require-corp:仅允许跨域加载具有 CORS 或Cross-Origin-Resource-Policy标头的资源。

11. Cross-Origin-Opener-Policy (COOP)

作用: 隔离文档上下文,防止跨窗口攻击。

add_header Cross-Origin-Opener-Policy "same-origin" always;

配置说明:

  • same-origin:仅允许相同源的页面与当前页面共享浏览上下文。

12. Cross-Origin-Resource-Policy (CORP)

作用: 限制资源的跨域加载。

add_header Cross-Origin-Resource-Policy "same-origin" always;

配置说明:

  • same-origin:仅允许资源从相同源加载。

为静态资源启用缓存

为静态资源(如图片、CSS、JS 文件)启用缓存可以显著提升性能,同时不会直接引发安全问题。以下是推荐的配置:

location ~* .(css|js|png|jpg|jpeg|gif|ico|woff|woff2|ttf|svg|eot|otf)$ { expires 1y; add_header Cache-Control "public"; add_header Content-Security-Policy "default-src 'self';"; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options SAMEORIGIN; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; access_log off; }

配置说明:

  • expires 1y:允许静态资源缓存 1 年。
  • Cache-Control: public:标记资源为公共可缓存。
  • access_log off:禁用访问日志,减少服务器存储压力。

完整示例配置

安全头配置文件

add_header Content-Security-Policy "default-src 'self' http: https: blob: ; script-src 'self' yourJsUrl; object-src 'self'; img-src 'self' data: blob: yourimgUrl; style-src 'unsafe-inline' http: ; frame-ancestors 'self'; worker-src blob:;" always; add_header X-Frame-Options SAMEORIGIN always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options: nosniff always; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always; add_header Referrer-Policy origin always; add_header Cache-Control no-store always; add_header Pragma no-cache always; add_header X-Permitted-Cross-Domain-Policies none always; add_header X-Download-Options noopen always; add_header Set-Cookie "Path=/; HttpOnly; Secure" always; add_header Cross-Origin-Embedder-Policy "require-corp" always; add_header Cross-Origin-Opener-Policy "same-origin" always; add_header Cross-Origin-Resource-Policy "same-origin" always;

如果js和img需要配置允许的域名,替换路径即可。

跨域头配置文件

add_header 'Access-Control-Allow-Origin' "$cors_origin" always; add_header 'Vary' 'Origin' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; add_header 'Access-Control-Max-Age' "$cors_max_age" always;

Nginx 的default.conf配置示例:

# 动态设置允许的跨域来源 map $http_origin $cors_origin { default ""; "~^https?://trusteddomain1.com$" $http_origin; "~^https?://trusteddomain2.com$" $http_origin; } # 动态设置缓存时间 map $http_origin $cors_max_age { default "0"; "~^https?://trusteddomain1.com$" "86400"; # 1 天 "~^https?://trusteddomain2.com$" "3600"; # 1 小时 } server { listen 8081; listen [::]:8081; server_name localhost; root /usr/share/nginx/html/applet/dist/build/h5/; server_tokens off; include /etc/nginx/conf.d/safety_headers.conf; location ~* .(css|js|png|jpg|jpeg|gif|ico|woff|woff2|ttf|svg|eot|otf)$ { expires 1y; include /etc/nginx/conf.d/safety_headers.conf; add_header Cache-Control "public"; access_log off; } # 禁止敏感路径访问 location = /auth/ { deny all; return 404; } error_page 403 =404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~* ^/(code|authFront|adminplus|external|auth|admin|marry){ include /etc/nginx/conf.d/safety_headers.conf; # 设置 CORS 响应头 include /etc/nginx/conf.d/cors_headers.conf; # 如果是预检请求 (OPTIONS),直接返回成功 if ($request_method = 'OPTIONS') { # 设置 CORS 响应头 add_header 'Access-Control-Allow-Origin' "$cors_origin" always; add_header 'Vary' 'Origin' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With' always; add_header 'Access-Control-Max-Age' "$cors_max_age" always; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain'; return 204; } proxy_pass backendUrl; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 1024m; proxy_buffer_size 1024k; proxy_buffers 16 1024k; proxy_busy_buffers_size 2048k; proxy_temp_file_write_size 2048k; } #location /manage { # alias /usr/share/nginx/html/manage/dist/; #} location ~^/oss/crossdomain.xml {return 403;} location ~^/oss/(.*HOST.*){return 403;} location ~^/oss/ { proxy_buffering off; proxy_set_header Host $http_host; rewrite ^/oss/(.*)$ /$1 break; proxy_pass http://172.17.0.1:9000; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root /usr/share/nginx/html; #} # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ .php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /.ht { # deny all; #} }

参考:http-headers-MDN

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:11:55

AI助力漏洞复现:Vulhub自动化搭建指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个基于Vulhub的自动化漏洞复现系统&#xff0c;要求&#xff1a;1.支持通过自然语言描述漏洞类型自动匹配Vulhub镜像 2.自动生成docker-compose配置文件 3.提供漏洞验证的测…

作者头像 李华
网站建设 2026/4/23 17:48:39

Thinkphp-Laravelvue药品招标采购系统的设计与实现

目录摘要关键技术项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 药品招标采购系统基于ThinkPHP、Laravel和Vue.js框架设计&#xff0c;旨在实现药品采购流程的数字化与智能化管理。系统采用前后端分离架构&#xff0c;后端基于ThinkPHP和La…

作者头像 李华
网站建设 2026/4/30 20:26:44

Zigbee 3.0标准在智能家居中的组网应用详解

Zigbee 3.0&#xff1a;如何用一张“自愈网”点亮你的全屋智能&#xff1f;你有没有过这样的经历&#xff1f;买了一个支持智能家居的灯泡&#xff0c;结果发现它和家里的传感器根本连不上&#xff1b;或者半夜起夜&#xff0c;等了两秒灯光才亮——这已经不算“智能”&#xf…

作者头像 李华
网站建设 2026/5/1 6:11:39

新手也能玩转TTS:图形化界面+API双模式,快速接入业务系统

新手也能玩转TTS&#xff1a;图形化界面API双模式&#xff0c;快速接入业务系统 &#x1f4cc; 为什么需要中文多情感语音合成&#xff1f; 在智能客服、有声阅读、虚拟主播、教育辅助等场景中&#xff0c;自然流畅且富有情感的语音输出已成为提升用户体验的关键要素。传统的…

作者头像 李华
网站建设 2026/5/1 0:48:37

用Sambert-HifiGan为电子书添加语音:自动化有声书制作

用Sambert-HifiGan为电子书添加语音&#xff1a;自动化有声书制作 引言&#xff1a;让文字“开口说话”——中文多情感语音合成的现实需求 在数字阅读日益普及的今天&#xff0c;电子书已不再是静态文本的简单集合。越来越多用户希望获得更沉浸、更便捷的听觉体验——通勤时听一…

作者头像 李华
网站建设 2026/5/1 6:16:39

医疗监护领域监测呼气末二氧化碳浓度的NDIR CO2传感器

呼气末二氧化碳&#xff08;endtidal carbon dioxide&#xff0c;ETCO2&#xff09;监测是一项无创、简便、实时、连续的功能学监测指标。随着监测设备的小型化、采样方法的多样化、监测结果的精准化&#xff0c;ETCO2在急诊科的临床工作中得到了越来越广泛的使用。在医疗监护领…

作者头像 李华