Nginx 常用安全头

devtools/2025/1/1 10:30:34/

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


常见的 HTTP 安全头及其作用

1. Content-Security-Policy (CSP)

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

nginx">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),需显式添加来源。
nginx">script-src 'self' https://cdn.jsdelivr.net;
  • 避免使用 'unsafe-inline''unsafe-eval',减少 XSS 风险。
  • 使用 noncehash 机制允许特定的内联脚本:
nginx">add_header Content-Security-Policy "script-src 'self' 'nonce-random123';";

2. Strict-Transport-Security (HSTS)

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

nginx">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 中,防止点击劫持攻击。

nginx">add_header X-Frame-Options SAMEORIGIN always;

配置说明:

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

4. X-XSS-Protection

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

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

配置说明:

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

5. X-Content-Type-Options

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

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

配置说明:

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

6. Referrer-Policy

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

nginx">add_header Referrer-Policy "origin" always;

配置说明:

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

7. Permissions-Policy (原 Feature-Policy)

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

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

配置说明:

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

8. Cache-Control 和 Pragma

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

nginx">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 和中间人攻击。

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

配置说明:

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

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

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

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

配置说明:

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

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

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

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

配置说明:

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

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

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

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

配置说明:

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

为静态资源启用缓存

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

nginx">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:禁用访问日志,减少服务器存储压力。

完整示例配置

安全头配置文件

nginx">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需要配置允许的域名,替换路径即可。

跨域头配置文件

nginx">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配置示例:

nginx"># 动态设置允许的跨域来源
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


http://www.ppmy.cn/devtools/146582.html

相关文章

【Leetcode】3046. 分割数组

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果 题目 题目链接&#x1f517; 给你一个长度为 偶数 的整数数组 n u m s nums nums 。你需要将这个数组分割成 n u m s 1 nums1 nums1 和 n u m s 2 nums2 nums2 两部分&#xff0c;要求&#xff1a; n u m s 1. l…

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言&#xff1a;未来已来&#xff0c;智能化的世界 想象一下&#xff0c;一个早晨&#xff0c;智能闹钟根据你的睡眠状态自动调整叫醒时间&#xff0c;咖啡机早已备好热腾腾的咖啡&#xff0c;窗帘缓缓拉开&#xff0c;迎接清晨的阳光。这不是科幻小说中的场景&#xff0c;而是…

基于单片机的智能递口罩机器人设计

本设计是一款智能递口罩机器人&#xff0c;主控器采用STM32单片机&#xff0c;ESP32协同控制&#xff0c;在支持MicroPython的OpenMV机器视觉模块的控制下&#xff0c;实现人脸搜索与识别&#xff0c;进而控制小车的运动及机械臂递口罩动作。这款机器人拥有温湿度传感器&#x…

C# 超高速高性能写日志

原理 使用列队先缓存到内存&#xff0c;独立线程从列队中使用log4net写到磁盘上。 日志写入列队 public void EnqueueMessage(string message, FlashLogLevel level, Exception ex null) {if ((level FlashLogLevel.Debug && _log.IsDebugEnabled)|| (level Flas…

mysql数据库中,一棵3层的B+树,假如数据节点大小是1k,那这棵B+可以存多少条记录(2100万的由来)

在MySQL中&#xff0c;3层的B树可以存储的数据量取决于多个因素&#xff0c;包括页大小、每行数据的大小以及索引项的大小。以下是一个详细的计算过程&#xff1a; 一、假设条件 页大小&#xff1a;在InnoDB存储引擎中&#xff0c;B树的每个节点&#xff08;页&#xff09;大…

python实战项目55:多线程爬取笔趣阁小说

python实战项目55:多线程爬取笔趣阁小说 一、明确需求二、单本小说下载三、使用concurrent.futures线程池模块下载并实现文件合并四、使用threading模块实现多线程下载并合并文件一、明确需求 需求是使用多线程爬取笔趣阁网站小说的所有章节内容并保存,多线程分别使用了conc…

如何在 Ubuntu 22.04 上安装 phpMyAdmin

简介 PHPMyAdmin 是在 Ubuntu 22.04 上管理 MySQL 数据库的绝佳选择。它是一个流行的工具&#xff0c;拥有简单、高效且用户友好的基于 Web 的界面&#xff0c;让你能够轻松地管理 MySQL 数据库。因此&#xff0c;许多开发人员、数据库管理员和网站所有者都信任 PHPMyAdmin 来…

三、Vue 模板语法

文章目录 一、核心概念二、插值操作三、属性绑定四、表达式支持五、指令系统六、用户输入与双向数据绑定七、过滤器八、缩写语法 一、核心概念 Vue.js 的精髓在于其简洁而高效的模板系统。通过这个系统&#xff0c;开发者能够以声明式的方式&#xff0c;轻松地将 DOM 元素与 Vu…