本文章暂未完成,不保证文章的准确性。不建议您作为参考或进行转载。
这篇文章最后更新于 天前,文中描述的信息可能已经过时,请多加查证后再作参考。
本文总结了一些与网站安全强相关的 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 | X-Frame-Options: DENY |
从上到下依次是:禁止被加载为内联框架元素等内容、仅允许同源的页面加载、仅允许来自 example.com 的页面加载为内联框架元素等内容,具体内容参见:MDN Web Docs
本文作者:Henrize Kim
文章链接: https://henrize.kim/article/047bf71cc9b5/
本文使用 CC BY-NC-SA 3.0 协议进行许可,使用时请注意遵守协议。