HTTP 安全头部

1 HSTS

1.1 作用

HSTSHTTP Strict Transport Secrity),服务器用此头部告知浏览器此网站只能使用 HTTPS 协议来访,浏览器应该自动把所有尝试使用 HTTP 的请求自动替换为 HTTPS 请求。

Chrome、Firefox等浏览器会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS 请求。

1.2 语法

1
2
3
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload
  • max-age=<expire-time>

设置在浏览器收到这个请求后的秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。

  • includeSubDomains 可选

如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。

  • preload 可选

查看 预加载 HSTS 获得详情。不是标准的一部分

1.3 注意

当网站没有证书错误时,浏览器才认为网站支持 HTTPS,然后才会使用 Strict-Transport-Security 的值,否则不会将 HTTP 自动转为 HTTPS。

2 CSP

2.1 作用

CSPContent-Security-Policy 内容安全策略),服务器用此头部来配置资源的可信来源白名单,从而减少和报告 XSS 攻击。当不包含 CSP 头部时,浏览器将使用同源策略。

2.2 语法

1
Content-Security-Policy: <policy-directive>; <policy-directive>
  • policy 参数由一系列描述策略指令的字符串组成。每个策略指令都描述了某个特定类型资源的生效范围。策略应该包含一个 default-src 策略指令,作为资源类型的默认策略。

    除此之外, 元素也可以被用来配置该策略, 例如:

1
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

2.3 示例

配置网站所有内容均来自自身(不包括子域名)

1
Content-Security-Policy: default-src 'self'

配置网站所有内容来自自身 或者 trusted.com及其子域

1
Content-Security-Policy: default-src 'self' *.trusted.com

配置网站内容中支持来自任何源的图片, 但是限制音频或视频需从信任的资源提供者(获得),所有脚本必须从特定主机服务器获取可信的代码

1
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com

3 X-Content-Type-Options

3.1 作用

此头部可以用来限制客户端(如浏览器)按照 content-type 配置的 mime 类型对返回数据进行解析。禁止客户端的 MIME 类型嗅探(在缺失 MIME 类型或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行MIME嗅探,不同浏览器可能会执行不同的操作)。

3.2 语法

1
X-Content-Type-Options: nosniff
  • nosniff

    下面两种情况的请求将被阻止:

    • 请求类型是”style“ 但是 MIME 类型不是 “text/css“,
    • 请求类型是”script“ 但是 MIME 类型不是 JavaScript MIME 类型

4 X-Frame-Options

4.1 作用

此头部用来限制客户端(如浏览器)是否可以在 frame iframe embed 或 object 中展示网页。

4.2 语法

支持下面三种值

1
2
3
X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/
  • deny

    表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

  • sameorigin

    表示该页面可以在相同域名页面的 frame 中展示。

  • allow-from *uri*

    表示该页面可以在指定来源的 frame 中展示。

4.3 注意

设置 meta 标签是无效的!例如 <meta http-equiv="X-Frame-Options" content="deny"> 没有任何效果。不要这样用!只有当像下面示例那样设置 HTTP 头 X-Frame-Options 才会生效。

5 X-Xss-Protection

5.1 作用

此响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。可以为尚不支持 CSP 的旧版浏览器的用户提供保护。

5.2 语法

1
2
3
4
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>

0

禁止XSS过滤。

1

启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。

1;mode=block

启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。

1; report= (Chromium only)

启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。