PHP中的子资源完整性和缓存清除技术

时间:2015-12-19 00:33:17

标签: javascript php css caching subresource-integrity

我希望为我的应用中的样式表和JavaScript文件等静态资源实施Subresource Integrity缓存清除。目前我使用PHP和Twig模板。

我知道有很多工具可以为所有JS和CSS文件生成哈希值,但我正在寻找如何将哈希值实现到数百个文件的<script><link>标记中。

This blog post描述了我尝试做的大部分内容,但作者只介绍了缓存清除,并在每次手动更改的文件名中使用静态时间戳。使用构建工具以编程方式生成该时间戳并不困难,但使用SRI时,该值是一个哈希值,对于每个文件都不同。

例如,header.html.twig

的摘录
<!-- cdn requests -->

<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'
    integrity='sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx'
    crossorigin='anonymous'></script>

<!-- same-origin requests -->

<script src='foo.1a516fba.min.js' 
    integrity='sha384-GlFvui4Sp4wfY6+P13kcTmnzUjsV78g61ejffDbQ1QMyqL3lVzFZhGqawasU4Vg+'></script>
<script src='bar.faf315f3.min.js'
    integrity='sha384-+vMV8w6Qc43sECfhc+5+vUA7Sg4NtwVr1J8+LNNROMdHS5tXrqGWSSebmORC6O86'></script>

每次更改src / hrefintegrity属性都不是一种理智的方法。

我可以编写一个Twig函数来调用PHP函数来每次对文件进行哈希处理,它可以在dev上运行,但这看起来非常昂贵。

对此有什么可行的方法?

1 个答案:

答案 0 :(得分:0)

回答你的问题:没有可行的方法,因为这不是Subresource Integrity的正确应用。

根据W3C,完整性属性为:

  

...一种机制,用户代理可以通过该机制验证已提供的已获取资源而无需进行意外操作

之所以介绍,是因为现在有很多页面正在从像您这样的CDN中获取CSS和JS脚本,如果黑客曾经控制过CDN,他们可能通过注入对数千个网站造成大量破坏恶意代码进入资源交付!

想象一下,如果code.jquery.comajax.googleapis.com提供的每个jQuery版本突然包含恶意代码!会有多少个网站受到影响?吓人。

通过向代理(浏览器)提供完整性哈希,以便将所获取资源的内容与之进行比较,您确保代理只有在完全按照您所说的预期时才继续执行代码。如果它有所不同,请不要相信它!

对于你的应用程序中的资源,我假设它们存在于同一台服务器上,因此没有中间路径可以拦截。如果黑客获得对服务器的控制并在JS脚本中注入恶意代码,他们也可以轻松地重新整理内容并更改HTML中的完整性属性。 Subresource Integrity不提供额外的安全检查。

<强>可是...

如果您想动态生成integrity属性的哈希值,我建议您解决这个非常有趣的问题:

使用Gulp(我个人的偏好)来连接,缩小和缩略图资源的文件名。使用gulp.src('bar.*.min.js')读取生成文件的内容。使用NPM sha1包将哈希创建为变量,最后可以使用gulp-inject更改src属性,然后使用gulp-replace来编写integrity属性。有些流程就像我想要的那样: - )

我希望能回答你的问题。