script新属性integrity与web安全,再谈xss
Author:zhoulujun Date:
一年前写过《前端安全配置xss预防针Content-Security-Policy(csp)配置详解》,我们用CSP保证执行正确的js代码,HTTPs限制文件传输不被篡改,但是,如果文件源被改变了呢?比如CDN被劫持后修改了呢(P劫持≈0,但!=0)
但现在,CDN均以表示以支持SRI为荣,不支持SRI功能为耻
SRI 全称是 Subresource Integrity,是用来解决由于 CDN 资源被污染而导致的 XSS 漏洞的方案。当浏览器检测加载脚本签名与给定的签名不一致时,会拒绝执行该脚本。
为什么CDN主推SRI功能,因为XSS,可以牵扯出DDoS攻击(分布式拒绝服务攻击),XSS比劫持肉鸡简单多了!
现代网站的大部分交互都来自于JavaScript,一般我们为了优化JS的加载速度,一般会分好几个域名加载js,而众多公用库一般放在第三方CDN上。JavaScript可以发出HTTP(S)请求,实现网页内容异步加载,但它也能将浏览器变成攻击者的武器。例如,下面的代码可以向受攻击网站发出洪水般的请求:
function imgflood() { var TARGET = 'victim-website.com' var URI = '/index.php?' var pic = new Image() var rand = Math.floor(Math.random() * 1000) pic.src = 'http://'+TARGET+URI+rand+'=val' } setInterval(imgflood, 10)
上述脚本每秒钟会在页面上创建10个image标签。该标签指向“victim-website.com”,并带有一个随机查询参数。如果用户访问了包含这段代码的恶意网站,那么他就会在不知情的情况下参与了对“victim-website.com”的DDoS攻击,如下图所示:
许多网站都使用一套通用的JavaScript库。为了节省带宽及提高性能,它们会使用由第三方托管的JavaScript库。jQuery是Web上最流行的JavaScript库,截至2014年大约30%的网站都使用了它。其它流行的库还有Facebook SDK、Google Analytics。如果一个网站包含了指向第三方托管JavaScript文件的script标签,那么该网站的所有访问者都会下载该文件并执行它。如果攻击者攻陷了这样一个托管JavaScript文件的服务器,并向文件中添加了DDoS代码,那么所有访问者都会成为DDoS攻击的一部分,这就是服务器劫持,如下图所示:
这种攻击之所以有效是因为HTTP中缺少一种机制使网站能够禁止被篡改的脚本运行。为了解决这一问题,W3C已经提议增加一个新特性子资源一致性。该特性允许网站告诉浏览器,只有在其下载的脚本与网站希望运行的脚本一致时才能运行脚本。这是通过密码散列实现的。这就是守门神:integrity=文件指纹
密码散列可以唯一标识一个数据块,任何两个文件的密码散列均不相同。属性integrity提供了网站希望运行的脚本文件的密码散列。浏览器在下载脚本后会计算它的散列,然后将得出的值与integrity提供的值进行比较。如果不匹配,则说明目标脚本被篡改,浏览器将不使用它。
如何开启 SRI 功能
SRI 开启需要有两个条件:首先需要资源为同域或者开启 CORS 设置,然后需要在<script>中提供签名以供校验。由于 SRI 在不匹配的时候就不执行脚本。
<script crossorigin="anonymous" integrity="sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f" src="http://lib.baomitu.com/jquery/3.2.1/jquery.min.js"> <script>
integrity牵扯出这么多,不由感慨,web安全,非一朝一夕之功啊——integrity刚刚出来的时候,各大厂浏览器对此并无太大反应,就自认为这个就是块鸡肋
在平常项目中,
webpack打包的话,推荐这个包webpack-subresource-integrity
gulp打包的话,用这个:gulp-sri-hash
具体配置的话,打开链接
参考文章:
广告:腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2mgtakkbtlick
转载本站文章《script新属性integrity与web安全,再谈xss》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js6/2018_0521_8115.html