首页 > webfront > ECMAS > js6 > > 正文

script新属性integrity与web安全,再谈xss

发布人:zhoulujun    点击:

一年前写过《前端安全配置xss预防针Content-Security-Policy(csp)配置详解》,我们用CSP限制页面可执行JS来源,HTTPs限制文件传输不被篡改

一年前写过《前端安全配置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攻击,如下图所示:

1.png

许多网站都使用一套通用的JavaScript库。为了节省带宽及提高性能,它们会使用由第三方托管的JavaScript库。jQuery是Web上最流行的JavaScript库,截至2014年大约30%的网站都使用了它。其它流行的库还有Facebook SDK、Google Analytics。如果一个网站包含了指向第三方托管JavaScript文件的script标签,那么该网站的所有访问者都会下载该文件并执行它。如果攻击者攻陷了这样一个托管JavaScript文件的服务器,并向文件中添加了DDoS代码,那么所有访问者都会成为DDoS攻击的一部分,这就是服务器劫持,如下图所示:

2.png

这种攻击之所以有效是因为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刚刚出来的时候,各大厂浏览器对此并无太大反应,就自认为这个就是块鸡肋

Screen-Shot-2018-05-21-at-12.13.19.png


在平常项目中,

webpack打包的话,推荐这个包webpack-subresource-integrity

gulp打包的话,用这个:gulp-sri-hash

具体配置的话,打开链接




参考文章:

浅谈JS DDoS攻击原理与防御

75CDN 增加 SRI 支持



广告:腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2mgtakkbtlick


上一篇:js6推荐一本书
下一篇:Last page