3

我想在我的应用程序中为静态资产(例如样式表和 JavaScript 文件)实现子资源完整性缓存破坏。目前我使用 PHP 和 Twig 模板。

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

这篇博客文章描述了我正在尝试做的大部分事情,但是作者只介绍了缓存破坏,并在文件名中使用了一个静态时间戳,他每次都手动更改。使用构建工具以编程方式生成该时间戳也不难,但使用 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/href和属性不是明智的做法。integrity

我可以编写一个 Twig 函数,它每次都调用一个 PHP 函数来对文件进行哈希处理,它可能在 dev 上运行良好,但这似乎在计算上非常昂贵。

什么是可行的方法?

4

1 回答 1

0

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

根据W3C,完整性属性是:

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

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

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

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

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

但...

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

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

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

于 2017-10-02T12:57:56.843 回答