当前位置: 首页 > article >正文

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


http://www.kler.cn/a/451648.html

相关文章:

  • vue中proxy代理配置(测试一)
  • 全面掌握 AutoGluon:从入门到生产环境的实践指南
  • TORCH_CUDA_ARCH_LIST
  • Git远程仓库的多人协作
  • springboot项目对数据库密码加解密
  • MimicBrush:智能图像编辑新宠,能否革新你的创意设计?
  • Linux(Centos 7.6)基本信息查看
  • Flutter:生成二维码
  • 鸿蒙开发使用axios请求后端网络服务出现该错误
  • 利用Python爬虫速卖通按关键字搜索AliExpress商品
  • 自动化 + 人工智能:投标行业的未来是什么样的?
  • SQL Server 数据库更新调用外部HTTP请求
  • react+antd的Table组件编辑单元格
  • uniapp中uni.scss如何引入页面内或生效
  • 【深度学习数学知识】-贝叶斯公式
  • RabbitMQ 路由(Routing)通讯方式详解
  • 金融领域研发效能的特性有哪些?拓展边界是什么?
  • 内网穿透ubuntu20 docker coplar
  • 14_HTML5 input类型 --[HTML5 API 学习之旅]
  • Centos7 安装 zip 软件失败,更换yum 源方法
  • 麒麟信安参展南京软博会,支持信创PC的新一代云桌面及全行业解决方案备受瞩目
  • 一文了解Oracle数据库如何连接(1)
  • Linux复习4——shell与文本处理
  • 基于C#实现的(WinForm)模拟操作系统文件管理系统
  • 基于STM32 USB接口的温度控制器设计
  • 基于SpringBoot在线音乐系统平台功能实现十二