CSP
和 SRI
能够预防XSS攻击
和数据包嗅探攻击
。html
来自MDN 的介绍git
内容安全策略(Content-Security-Policy)
是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括 跨站脚本 (XSS)
和数据注入攻击
等。不管是数据盗取、网站内容污染仍是散发恶意软件,这些攻击都是主要的手段。github
CSP
被设计成彻底向后兼容(除CSP2
在向后兼容有明确说起的不一致; 更多细节查看这里 章节1.1)。不支持 CSP
的浏览器也能与实现了 CSP
的服务器正常合做,反之亦然:不支持 CSP
的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。若是网站不提供 CSP 头部
,浏览器也使用标准的同源策略。浏览器
为使 CSP
可用, 你须要配置你的网络服务器返回 Content-Security-Policy
HTTP头部 ( 有时你会看到一些关于 X-Content-Security-Policy
头部的提法, 那是旧版本,你无须再如此指定它)。安全
HTTP Response Headers ,举例:bash
除此以外, <meta>
元素也能够被用来配置该策略, 例如服务器
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
复制代码
"Content-Security-Policy":策略字符串
复制代码
资源限制能够精细到 img
、font
、style
、frame
等粒度。网络
Content-Security-Policy: default-src 'self'
复制代码
一个网站管理者想要全部内容均来自站点的同一个源 (不包括其子域名),详细 Content-Security-Policy/default-src函数
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
复制代码
在这里,各类内容默认仅容许从文档所在的源获取, 但存在以下例外:工具
容许使用 eval() 以及类似的函数来从字符串建立代码。必须有单引号。
更多策略见 CSP directives
子资源完整性(SRI)
是容许浏览器检查其得到的资源(例如从 CDN 得到的)是否被篡改的一项安全特性。它经过验证获取文件的哈希值是否和你提供的哈希值同样来判断资源是否被篡改。
不少时候咱们使用CDN多个站点之间共享了脚本和样式,以便提升网站性能节省宽带。然而也存在风险,若是攻击者获取了CDN的控制权,就能够将任意内容恶意注入到CDN文件中,从而攻击了加载此CDN资源的站点。因此就须要 SRI
来确保Web应用程序得到的文件未通过第三方注入或者其余形式的修改来下降被攻击的风险。
将文件内容经过 base64 编码
后的哈希值,写入你所引用的 <script>
或 <link>
标签的 integrity
属性值中便可启用子资源完整性功能。浏览器在加载此内容执行以前,会判断该文件的哈希值是否和 integrity
预期的一致,只有一致才会执行。
SRI Hash Generator 是一个在线生成 SRI 哈希值的工具。
<script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>
复制代码
你能够根据内容安全策略(CSP)
来配置你的服务器使得指定类型的文件遵照 SRI
。这是经过在 CSP 头部
添加 require-sri-for
指令实现的:
Content-Security-Policy: require-sri-for script;
复制代码
这条指令规定了全部 JavaScript
都要有 integrity 属性,且经过验证才能被加载。
因此,只要文件变化了,浏览器就不会执行,有效避免了脚本攻击。
参考连接
关于本文