子资源完整性 SRI

子资源完整性即是:Subresource Integrity。这是一个比较简单,但是很有用的安全性内容。

如果你的脚本和样式文件存放在cdn,SRI就可以帮你验证文件的完整性,防止被篡改。它的使用也很简单,就是先使用sha256|sha384|sha512这三种hash算法中的一种,对文件内容进行hash运算,然后对hash值进行base64编码,并把编码过后的值写入到scriptlink文件的integrity属性上。

使用 base64 编码 sha384 算法计算出摘要后的 integrity 值的例子:

1
sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC

浏览器从cdn加载到指定的脚本或样式文件时,将会对它们使用同样的hash算法和base64编码计算一个hash值,最后与scriptlink上的integrity属性进行比对,两个hash一致,就说明资源没有被篡改。

CSP中有一个指令:require-sri-for

1
2
3
Content-Security-Policy: require-sri-for script;
Content-Security-Policy: require-sri-for style;
Content-Security-Policy: require-sri-for script style;

这个指令可以提供对脚本或样式文件的SRI限制,只有满足了SRI,脚本或样式才允许被加载。

vue-cli4里面,也有一个integrityoption,可以在构建的时候自动给scriptlink注入SRI必要的hash值。