PHP 中的子资源完整性和缓存破坏技术

Posted

技术标签:

【中文标题】PHP 中的子资源完整性和缓存破坏技术【英文标题】:Subresource integrity and cache busting techniques in PHP 【发布时间】:2016-03-25 18:35:01 【问题描述】:

我想在我的应用程序中为静态资产(例如样式表和 javascript 文件)实现 Subresource Integrity缓存清除。目前我使用 php 和 Twig 模板。

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

This blog post 描述了我正在尝试做的大部分事情,但是作者只介绍了缓存破坏,并在文件名中使用了他每次手动更改的静态时间戳。使用构建工具以编程方式生成时间戳也不难,但使用 SRI,该值是一个散列,每个文件都不同

例如,header.html.twig 的 sn-p:

<!-- 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】:

回答您的问题:没有可行的方法,因为这不是子资源完整性的正确应用。

根据W3C完整性属性为:

...一种机制,用户代理可以通过该机制验证获取的资源是否已在没有意外操作的情况下交付

之所以引入它是因为现在很多页面都像您一样从 CDN 获取其 CSS 和 JS 脚本,如果黑客曾经获得对 CDN 的控制权,他们可能会通过注入对数千个网站造成巨大的破坏恶意代码进入资源传递!

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

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

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

但是...

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

使用 Gulp(我的个人喜好)来连接、缩小和指纹您的资源的文件名。使用gulp.src('bar.*.min.js') 读取生成文件的内容。使用NPM sha1 包将哈希创建为变量,最后可能使用gulp-inject 更改src 属性,然后gulp-replace 也写入integrity 属性。我会追求这样的一些流程:-)

我希望这能回答你的问题。

【讨论】:

以上是关于PHP 中的子资源完整性和缓存破坏技术的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个标志可以禁用铬中的子资源完整性检查?

使用 Require JS 的 angularJS 应用程序中的子资源完整性

使用 javascript 的图像的子资源完整性

Firebase 上的子资源完整性安全标头

animate.css 的子资源完整性?

PHP 的 APC 用户数据缓存的完整替代方案?