一些安全相关的 HTTP 响应头整理

Note

本文章暂未完成,不保证文章的准确性。不建议您作为参考或进行转载。

这篇文章最后更新于 天前,文中描述的信息可能已经过时,请多加查证后再作参考。

本文总结了一些与网站安全强相关的 HTTP 响应头,并附上了一些简单的介绍。绝大多数文章内容参考自 MDN Web Docs 中关于 HTTP 响应头的说明。

内容安全策略 Content-Security-Policy

1
Content-Security-Policy: script-src 'self'; img-src cdn.example.com

内容安全策略(CSP)用于限定页面上显示的 JavaScript 脚本、CSS 文件、图片等内容的来源,可以用来防范 XSS 攻击。内容安全策略不仅可以在 HTTP 响应头规定,也可以通过网页 <head> 标签内的元数据 <meta> 规定,大致如下:

1
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; img-src cdn.example.com" />

上面两个示例展示了安全内容策略的基本格式,上面两个例子中的 script-src 'self' 规定了“仅允许从同源 URL 加载脚本”,img-src cdn.example.com 规定了“只从 cdn.example.com 加载图片”。

同时,除了规定页面上的脚本和图片加载来源以外,我们还可以通过内容安全策略规定以下内容(这里仅展示比较常用的字段,完整列表参见 MDN Web Docs):

  • default-src:当加载的内容未被规定时,默认采用的规定。
  • frame-src:规定了页面上 <iframe> 标签(即内联框架)的加载源。
  • object-src:规定了页面上的 <object><embed> 标签(即对象和容器)的加载源。
  • connect-src:规定了网页在进行 XHR 和 WebSocket 等连接时的对方的 URL(完整列表见 MDN Web Docs
  • style-src:规定了页面上的 <style> 标签(即 CSS)的加载源。
  • media-src:规定了页面上的 <audio><video> 标签(即音频和视频)的加载源。
  • font-src:规定了 CSS 文件中使用 @font-face 后规定的字体的加载源。

在如上内容后添加一些具体的值就可以具体地限制上文中的“加载源”,还可以进行哈希校验等操作。一些常用的值如下(这里仅展示比较常用的字段,完整列表参见 MDN Web Docs):

简单的关键字

  • 'none':不允许加载任何资源。
  • 'self':仅允许从同源 URL 加载。

指定协议、域名或路径

指定域名、端口、具体的路径:例如 https://a.example.com:443/js/script.js

其中的协议、二级域名、端口、文件路径可以选择性省略。例如只指定域名和路径:example.com/js/script.js 代表只能从 example.com 下的 /js/script.js 下加载对应的内容;例如 https: data: 代表仅允许从以上两种协议下载内容;例如 a.example.com 仅允许从指定域名下载内容。

同时,我们也可以使用通配符取消对应的限制,比如:*:/*.example.com:* 指可以从 example.com 域名下的任意协议、任意二级域名、任意端口、任意路径加载内容。

仅可以在 script-src 后使用的一些值

  • sha*-*:允许运行 SHA 运算结果为特定值的脚本运行,支持的算法有 SHA256、SHA382、SHA512,后面加 base64 编码的结果。一个例子:sha256-97jJNVCB9TsaVF+sTbRNpaYc+hoKITecImpJL577uxM=

  • nonce-*:在连字号后添加一段随机字符串,允许运行 HTML 元素中 nonce 属性值与以上随机字符串相同的的脚本。按照标准,建议每次请求都更换一次随机字符串。
    例如 nonce-23isz6l9sa8dxho8 对应允许脚本 <script nonce="23isz6l9sa8dxho8" src="./script.js" /> 运行。

除了如上示例中规定加载内容来源的功能外,还可以限制表单提交的地址,以及报告有可能的 XSS 攻击行为,具体内容参见:MDN Web Docs阮一峰的网络日志 中的相关描述。

内联框架选项 X-Frame-Options

用于规定网页是否允许被加载为其它网页的内联框架元素( <iframe> )等加载,可以用于防范点击劫持( Click Jacking )攻击,有以下三种设置:

1
2
3
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM example.com

从上到下依次是:禁止被加载为内联框架元素等内容、仅允许同源的页面加载、仅允许来自 example.com 的页面加载为内联框架元素等内容,具体内容参见:MDN Web Docs

本文作者:Henrize Kim

文章链接: https://henrize.kim/article/047bf71cc9b5/

本文使用 CC BY-NC-SA 3.0 协议进行许可,使用时请注意遵守协议。