Blue Flower

一、常用安全 Header 释义

1. Strict-Transport-Security (HSTS)

知识兔

HTTP Strict Transport Security(通常简称为 HSTS)是一个安全功能,它告诉浏览器只能通过 HTTPS 访问当前资源,而不是 HTTP

作用:访问一个 HTTPS 网站,要求浏览器总是通过 HTTPS 访问它。

语法:

1
2
3
strict-transport-security: max-age=
strict-transport-security: max-age=; includeSubDomains
strict-transport-security: max-age=; includeSubDomains; preload

示例:

1
strict-transport-security: max-age=31536000; includeSubDomains; preload

释义:

  • max-age= 设置在浏览器收到这个请求后的 秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。
  • includeSubDomains 可选,如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
  • preload 可选,加入预加载列表

谷歌维护着一个 HSTS 预加载服务。按照如下指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌分享的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。

输入 chrome://net-internals/#hsts,进入 HSTS 管理界面,可以增加 / 删除 / 查询 HSTS 记录。
将网站加入预加载列表:https://hstspreload.org/

参考:HTTP Strict Transport Security (HSTS)

2. Public-Key-Pins(HPKP)

知识兔

作用:防止中间人攻击。是 HTTPS 网站防止攻击者利用 CA 错误签发的证书进行中间人攻击的一种安全机制,用于预防 CA 遭入侵或者其他会造成 CA 签发未授权证书的情况。

服务器通过 Public-Key-Pins(或 Public-Key-Pins-Report-Onky 用于监测)header 向浏览器传递 HTTP 公钥固定信息。

语法:

1
Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubdomains][; report-uri="reportURI"]

字段含义:

  • pin-sha256:即证书指纹,允许出现多次,实际上应用最少指定两个
  • max-age:过期时间
  • includeSubdomains:是否包含子域
  • report-uri:验证失败时上报的地址

参考:Public-Key-Pins

3. Content-Security-Policy(CSP)

知识兔

X-Content-Security-Policy(旧版)/Content-Security-Policy

CSP 是一个计算机的安全标志,主要用来防止 XSS、点击劫持、SQL 注入等攻击;CSP 通过定义运行加载脚本的位置和内容防止恶意代码的加载。

作用:用于定义页面可以加载哪些资源,减少和上报 XSS 的攻击,防止数据包嗅探攻击。

响应头:

  • Content-Security-Policy
  • X-Content-Security-Policy
  • X-Webkit-CSP

使用方法:

1
Content-Security-Policy: default-src 'self'
  • 一个策略由一系列策略指令组成,每个策略指令都描述了一个针对某个特定类型资源以及生效范围的策略。
  • default-src 是 CSP 指令,多个指令之间使用英文分号分割。
  • self 是指令值,多个指令值用英文空格分割。
  • 支持的 CSP 指令。

元素也可以用于配置 CSP:

指令 指令值示例 说明
default-src ‘self’ cnd.a.com 定义针对所有类型资源的默认加载策略,某类型资源如果没有单独定义策略,就使用默认的
script-src ‘self’ js.a.com 定义针对 JavaScript 的加载策略
style-src ‘self’ css.a.com 定义针对样式的加载策略
img-src ‘self’ img.a.com 定义针对图片的加载策略
connect-src ‘self’ 针对 Ajax、WebSocket 等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为 400 的响应
font-src font.a.com 针对 WebFont 的加载策略
object-src ‘self’ 针对 等标签引入的 flash 等插件的加载策略
media-src media.a.com 针对 等标签引入的 HTML 多媒体的加载策略
frame-src ‘self’ 针对 frame 的加载策略
sanbox allow-forms 对请求的资源启用 sandbox(类似于 iframe 的 sandbox 属性)
report-uri /report-uri 告诉浏览器如果请求不被策略允许,往哪个地址提交日志信息。如果想让浏览器只汇报日志,不阻止任何内容,可以改用 Content-Security-Policy-Report-Only 头

指令值可以由下面内容组成:

指令值 指令值示例 说明
img-src 允许任何内容
‘none’ img-src ‘none’ 不允许任何内容
‘self’ img-src ‘self’ 允许来自相同源的内容(相同的协议、域名和端口)
data: img-src data: 允许 data: 协议 (如 base64 编码的图片)
www.a.com img-src img.a.com 允许加载指定域名的资源
.a.com img-src .a.com 允许加载 a.com 任何子域的资源
https://img.com img-src https://img.com 允许加载 img.com 的 https 资源
https: img-src https: 允许加载 https 资源
‘unsafe-inline’ script-src ‘unsafe-inline’ 允许加载 inline 资源(例如常见的 style 属性,onclick, inline js, inline css)
‘unsafe-eval’ script-src ‘unsafe-eval’ 允许加载动态 js 代码,例如 eval()

违例报告

  • document-uri:发生违规的文档的 URI。
  • referrer:违规发生处的文档引用地址
  • blocked-uri:被 CS P 阻止的资源 URI。如果被阻止的 URI 来自不同的源而非文档 URI,则被阻止的资源 URI 会被删减,仅保留协议、主机和端口号。
  • violated-directive:违反的策略名称
  • original-policy:在 Content-Security-Policy HTTP header 中指明的原始策略。

示例:让浏览器自动升级请求,访问到 http 资源时自动替换成 https 请求

1
Content-Security-Policy: upgrade-insecure-requests

参考:内容安全策略 CSP

4. Referrer-Policy

知识兔

用来监管哪些访问来源信息——会在 Referer 中发送——应该被包含在生成的请求当中。(注意 Referer 实际上是单词 “referrer” 的错误拼写。Referrer-Policy 这个首部并没有延续这个错误拼写。)

作用:增加隐私保护。

语法

1
2
3
4
5
6
7
8
Referrer-Policy: no-referrer
Referrer-Policy: no-referrer-when-downgrade
Referrer-Policy: origin
Referrer-Policy: origin-when-cross-origin
Referrer-Policy: same-origin
Referrer-Policy: strict-origin
Referrer-Policy: strict-origin-when-cross-origin
Referrer-Policy: unsafe-url

可配置值:

  • no-referrer:不允许被记录。
  • origin:只记录 origin,即域名。
  • strict-origin:只有在 HTTPS -> HTTPS 之间才会被记录下来。
  • strict-origin-when-cross-origin:同源请求会发送完整的 URL;HTTPS->HTTPS,发送源;降级下不发送此首部。
  • no-referrer-when-downgrade(default):同 strict-origin。
  • origin-when-cross-origin:对于同源的请求,会发送完整的 URL 作为引用地址,但是对于非同源请求仅发送文件的源。
  • same-origin:对于同源请求会发送完整 URL,非同源请求则不发送 referer。
  • unsafe-url:无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。(可能会泄漏敏感信息)。

参考:Referrer-Policy

5. Expect-CT

知识兔

Expect-CT 头允许站点选择性报告和 / 或执行证书透明度 (Certificate Transparency) 要求,来防止错误签发的网站证书的使用不被察觉。当站点启用 Expect-CT 头,就是在请求浏览器检查该网站的任何证书是否出现在公共证书透明度日志之中。

另外一种解释:用于指示浏览器或者客户端验证签名证书的时间戳

语法

1
2
3
Expect-CT: report-uri="<uri>";
enforce;
max-age=<age>

指令

  • max-age

    该指令指定接收到 Expect-CT 头后的秒数,在此期间用户代理应将收到消息的主机视为已知的 Expect-CT 主机。如果缓存接收到的值大于它可以表示的值,或者如果其随后计算溢出,则缓存将认为该值为 2147483648(2 的 31 次幂)或其可以方便表示的最大正整数。

  • report-uri= 可选

    该指令指定用户代理应向其报告 Expect-CT 失效的 URI。当 enforce 指令和 report-uri 指令共同存在时,这种配置被称为 “强制执行和报告” 配置,示意用户代理既应该强制遵守证书透明度政策,也应当报告违规行为。

  • enforce 可选

    该指令示意用户代理应强制遵守证书透明度政策(而不是只报告合规性),并且用户代理应拒绝违反证书透明度政策的之后连接。当 enforce 指令和 report-uri 指令共同存在时,这种配置被称为 “强制执行和报告” 配置,示意用户代理既应该强制遵守证书透明度政策,也应当报告违规行为。

示例

以下示例指定 24 小时的证书透明度执行,并向 foo.example 报告违规行为.

1
Expect-CT: max-age=86400; enforce; report-uri="https://foo.example/report"

参考:Expect-CT

6. Access-Control-Allow-Origin

知识兔

Access-Control-Allow-Origin 响应头指定了该响应的资源是否被允许与给定的 origin 共享。跨原始资源共享(CORS)允许网站在它们之间共享内容,为了使网站之间安全的跨域获取资源,可以通过设置 Access-Control-Allow-Origin 来允许指定网站来跨域获取本地资源。

当目标页面的 response 中包含 Access-Control-Allow-Origin 这个 header,并且 value 有对方的域名,浏览器才允许目标获取页面的数据。

示例:只允许”10.10.10.10“访问自己本地资源

1
Access-Control-Allow-Origin: http://10.10.10.10

语法

1
2
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin:

指令

*

对于不需具备凭证(credentials)的请求,服务器会以 “*” 作为通配符,从而允许所有域都具有访问资源的权限。

指定一个可以访问资源的 URL。

参考:Access-Control-Allow-Origin

7. Cache-Control

知识兔

Cache-Control 通用消息头字段,被用于在 http 请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。

缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,特定请求被禁止缓存可以提高安全性

语法

指令不区分大小写,并且具有可选参数,可以用令牌或者带引号的字符串语法。多个指令以逗号分隔。

  • 缓存请求指令

客户端可以在 HTTP 请求中使用的标准 Cache-Control 指令。

1
2
3
4
5
6
7
Cache-Control: max-age=
Cache-Control: max-stale[=]
Cache-Control: min-fresh=
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached
  • 缓存响应指令

服务器可以在响应中使用的标准 Cache-Control 指令。

1
2
3
4
5
6
7
8
9
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=
Cache-control: s-maxage=
  • 扩展 Cache-Control 指令

拓展缓存指令不是核心 HTTP 缓存标准文档的一部分,使用前请注意检查 兼容性

1
2
3
Cache-control: immutable
Cache-control: stale-while-revalidate=
Cache-control: stale-if-error=

指令

  • 可缓存性

    • public

      表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1. 该响应没有 max-age 指令或 Expires 消息头;2. 该响应对应的请求方法是 POST。)

    • private

      表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。

    • no-cache

      在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证 (协商缓存验证)。

    • no-store

      缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。

  • 到期

    • max-age=

      设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与 Expires 相反,时间是相对于请求的时间。

    • s-maxage=

      覆盖 max-age 或者 Expires 头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它。

    • max-stale[=]

      表明客户端愿意接收一个已经过期的资源。可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。

    • min-fresh=

      表示客户端希望获取一个能在指定的秒数内保持其最新状态的响应。

    • stale-while-revalidate=

      表明客户端愿意接受陈旧的响应,同时在后台异步检查新的响应。秒值指示客户愿意接受陈旧响应的时间长度。

    • stale-if-error=

      表示如果新的检查失败,则客户愿意接受陈旧的响应。秒数值表示客户在初始到期后愿意接受陈旧响应的时间。

  • 重新验证和重新加载

    • must-revalidate

      一旦资源过期(比如已经超过 max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。

    • proxy-revalidate

      与 must-revalidate 作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。

    • immutable

      表示响应正文不会随时间而改变。资源(如果未过期)在服务器上不发生改变,因此客户端不应发送重新验证请求头(例如 If-None-Match 或 If-Modified-Since)来检查更新,即使用户显式地刷新页面。在 Firefox 中,immutable 只能被用在 https:// transactions. 有关更多信息,请参阅 这里

  • 其他

    • no-transform

      不得对资源进行转换或转变。Content-EncodingContent-RangeContent-Type 等 HTTP 头不能由代理修改。例如,非透明代理或者如 Google’s Light Mode 可能对图像格式进行转换,以便节省缓存空间或者减少缓慢链路上的流量。no-transform 指令不允许这样做。

    • only-if-cached

      表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。

参考:Cache-Control

知识兔

由服务器端向客户端发送 cookie

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
Set-Cookie: =
Set-Cookie: =; Expires=
Set-Cookie: =; Max-Age=
Set-Cookie: =; Domain=
Set-Cookie: =; Path=
Set-Cookie: =; Secure
Set-Cookie: =; HttpOnly

Set-Cookie: =; SameSite=Strict
Set-Cookie: =; SameSite=Lax

// Multiple directives are also possible, for example:
Set-Cookie: =; Domain=; Secure; HttpOnly

安全相关:

  • HttpOnly:防止使用 javascript(如 document.cookie)去存取 cookie
  • Secure:强制 cookie 只能在 HTTPS 环境下传递

参考:Set-Cookie

9. X-Frame-Options

知识兔

是否允许一个页面可在