响应头详解

181 阅读7分钟

通用响应头

适用于请求和响应的通用元数据

Date

服务器生成响应的时间

Server

服务器软件的信息(如 nginx/1.23.3),如非必要移除Server头

安全相关响应头

增强安全性,防御攻击

Content-Security-Policy (CSP)

作用: 防止 XSS、数据注入等攻击,控制资源加载来源。

示例:

 add_header Content-Security-Policy "
         default-src 'self';
         font-src 'self' http://at.alicdn.com data:;
         script-src 'self' https://api.tianditu.gov.cn http://api.tianditu.gov.cn 'unsafe-eval' 'unsafe-inline';
         style-src 'self' https://api.tianditu.gov.cn http://api.tianditu.gov.cn 'unsafe-eval' 'unsafe-inline';
         img-src * data:;
         connect-src 'self' https://api.tianditu.gov.cn http://api.tianditu.gov.cn;
         object-src 'none';
         frame-ancestors 'self';
         base-uri 'self';
         form-action 'self';
 ";

指令:

  • default-src:作为其他资源类型指令的默认值。若未为特定资源类型单独指定策略,就采用 default-src 的策略。
  • script-src:控制 JavaScript 脚本的加载和执行来源。
  • style-src:控制 CSS 样式表的加载和执行来源。
  • img-src:控制图片资源的加载来源。
  • connect-src:控制通过 XMLHttpRequestfetchWebSocket 等 API 发起的连接请求的目标来源。
  • font-src:控制字体资源的加载来源。
  • object-src:控制 <object><embed><applet> 等标签加载的插件资源的来源。
  • media-src:控制 <audio><video> 等媒体资源的加载来源。
  • frame-src:控制 <frame><iframe> 标签加载的页面来源。
  • <font style="color:rgb(34, 34, 34);">base-uri</font>:限制 <base> 标签中指定的基础 URI,该基础 URI 会影响页面中所有相对 URI 的解析。
  • form-action:限制 <form> 表单提交的目标 URI。
  • frame-ancestors:控制当前页面可以被哪些页面嵌入到 <frame><iframe><object><embed><applet> 中。
  • worker-src:控制 Web Worker 和 Shared Worker 的加载来源。
  • manifest-src:控制 Web App Manifest 文件的加载来源。
  • report-uri:指定一个 URI,当发生 CSP 违规时,浏览器会向该 URI 发送一份违规报告。
  • report-to:与 report-uri 类似,用于指定 CSP 违规报告的接收端点,但使用 Reporting API 规范。

参数:

  • self:表示当前源,即当前网页所在的域名和协议。
  • 'none':表示禁止加载任何资源。
  • 'unsafe-inline':允许使用内联代码,如内联脚本和内联样式。但使用该关键字会带来安全风险,因为攻击者可能会利用 XSS 漏洞注入恶意的内联代码。
  • 'unsafe-eval':允许使用 eval() 或类似的动态代码执行方法。使用该关键字也存在安全风险,因为攻击者可能会利用它执行恶意脚本。
  • 'nonce-<base64-value>'nonce 是一个一次性的随机值,用于允许特定的内联脚本或样式执行。服务器会为每个请求生成一个新的 nonce 值,并将其添加到 CSP 策略和 HTML 标签中。(太复杂,一般不需要配置)
 add_header Content-Security-Policy "script-src 'self' 'nonce-123456';";
 <script nonce="123456">console.log('这是一个带有 nonce 的内联脚本');</script>
  • 'sha256-<base64-value>''sha384-<base64-value>''sha512-<base64-value>':这些是哈希值,用于允许特定的内联脚本或样式执行。通过计算内联代码的哈希值,并将其添加到 CSP 策略中,只有哈希值匹配的代码才能执行。(太复杂,一般不需要配置)
 # 对代码部分计算哈希
 echo -n "console.log('这是一个内联脚本');" | openssl dgst -sha256 -binary | openssl enc -base64
 # 把计算得到的哈希值放到 sha256- 后面
 add_header Content-Security-Policy "script-src 'self' 'sha256-计算得到的哈希值';";
 <script>console.log('这是一个内联脚本');</script>
  • https://api.tianditu.gov.cn:具体域名,允许从指定的域名加载资源。可以指定协议、端口等信息。
  • 通配符*:表示允许从任何来源加载资源。使用该通配符会降低安全性,应谨慎使用。
  • data::允许使用 data: URI 来加载资源,如内联图片、字体等。
  • blob::允许使用 blob: URI 来加载资源,通常用于处理二进制大对象。
  • filesystem:允许使用 filesystem: URI 来加载资源,用于访问文件系统。

X-Content-Type-Options

作用: 它的主要作用是防止浏览器自动猜测内容类型,从而避免潜在的安全风险(如 XSS 攻击)

示例:

 add_header X-Content-Type-Options nosniff;

参数:

  • nosniff:最常用的值,表示禁止浏览器进行 MIME 嗅探。如果服务器返回 Content-Type: text/plain,浏览器会严格按纯文本处理,不会尝试渲染为 HTML 或执行脚本。
  • 空值(或未设置):浏览器会默认开启 MIME 嗅探,可能导致安全风险。

兼容性:

  • 现代浏览器:Chrome、Firefox、Edge、Safari 等均支持 nosniff
  • 旧版本浏览器:IE8+ 支持,更早版本可能不支持。

注:

  • 如果服务器返回的 MIME 类型与实际内容不匹配,可能导致页面无法正确渲染(例如,图片被误判为文本)。需确保 Content-Type 头设置正确。
  • 若需允许某些场景的嗅探(如上传文件的预览),需谨慎权衡安全风险。

Strict-Transport-Security (HSTS)

作用: 用于强制浏览器和客户端仅通过 HTTPS 协议与服务器通信,从而防止中间人攻击(MITM)和降级攻击。它通过指示浏览器记住网站的 HTTPS 配置,减少对 HTTP 的依赖。

示例:

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

参数:

  • max-age:指定 HSTS 策略的有效期(单位:秒)。
  • includeSubDomains:将 HSTS 策略应用于所有子域名(如 example.comblog.example.com)。
  • preload:将域名加入浏览器的预加载列表,使策略在用户首次访问前生效。

兼容性:

  • 现代浏览器:Chrome、Firefox、Edge、Safari 等均支持 HSTS。
  • 旧版本浏览器:IE10+ 支持,更早版本可能不支持。

注:

  • 证书问题:确保 HTTPS 证书有效(非自签名、未过期),否则浏览器会拒绝访问
  • 回退风险:若 max-age 设置过长且配置错误,可能导致网站无法访问,需通过清除浏览器缓存或等待过期解决。
  • 预加载限制:加入预加载列表后,策略无法撤销,需谨慎操作。
  • 混合内容:确保页面资源(如图片、脚本)均通过 HTTPS 加载,避免浏览器忽略 HSTS。

X-Frame-Options

作用: 用于控制网页是否允许被嵌入到 iframeframe 或 object 中,从而防止点击劫持(Clickjacking)攻击。它通过限制网页的嵌入行为,保护用户交互安全。

示例:

 add_header X-Frame-Options "SAMEORIGIN";

参数:

  • DENY:禁止任何来源嵌入当前页面,无论是否同源。
  • SAMEORIGIN:仅允许与当前页面同源的网站嵌入(如 https://example.com 嵌入 https://example.com/page)。
  • ALLOW-FROM uri:指定允许嵌入的具体 URI(如 https://trusted.example.com)。

兼容性:

  • 现代浏览器:Chrome、Firefox、Edge、Safari 等均支持 DENYSAMEORIGIN
  • 旧版本浏览器:IE8+ 支持,更早版本可能不支持。

注:

  • ALLOW-FROM 的弃用:由于安全性不足且浏览器兼容性下降,应优先使用 CSP 的 frame-src
  • 与 CORS 的关系:若需嵌入第三方内容,需同时配置 CORS 头(如 Access-Control-Allow-Origin),否则浏览器可能拒绝加载。
  • 嵌套框架的限制:若页面被嵌套在多个框架中,最内层的 X-Frame-Options 可能覆盖外层设置,需统一配置。

缓存控制响应头

优化资源缓存策略。

Cache-Control

设置缓存规则(如 max-age=3600)。

Expires

指定资源过期时间(HTTP/1.0 标准)。

内容协商响应头

描述内容属性。

Content-Type

MIME 类型(如 text/html)。

Content-Language

内容语言(如 zh-CN)。

重定向与状态响应头

控制请求流程。

Location

配合 301/302/307 重定向。

Refresh

自动刷新或跳转(如 Refresh: 5; url=https://example.com)。

Cookie 相关响应头

管理客户端 Cookie。

Set-Cookie

设置 Cookie(如 sessionid=abc123)。

Cookie-Secure

标记 Cookie 仅 HTTPS 传输。

实体响应头

描述响应体属性。

Content-Length

响应体字节长度。

Content-Encoding

压缩算法(如 gzip)。

其他响应头

Connection

控制持久连接(如 keep-alive)。

Vary

指示缓存根据请求头变化(如 Vary: User-Agent)。

安全配置建议

  • 始终启用CSP、HSTS 和 X-Content-Type-Options
  • 最小化暴露,移除敏感头或模糊值