在子资源完整性检查中处理加载错误

Handling load error within subresource integrity check

我正在实施子资源完整性检查。我想实施回退,以便 1) 浏览器从我的 CDN 加载,执行完整性检查并继续或 2) 在完整性检查失败的情况下,嵌入式脚本启动并从我的应用程序中检索所需的脚本服务器(我控制的资源)。

我有一个简单的 javascript 可以捕获 window.onerror 事件,但脚本实际上检测到未捕获的 ReferenceError(我的页面引用了外部资源中的脚本),而不是浏览器错误 "Failed to find a valid digest...".

有没有人找到检测完整性检查失败的方法,然后使用javascript从更受信任的位置拉取第三方托管资源?

看看这个 SRI-fallback 的实现:

https://github.com/cyph/sri-fallback

您可以检查加载的资源是否存在并加载后备本地副本:

<script src="https://code.jquery.com/jquery-1.12.0.min.js" integrity="sha256-Xxq2X+KtazgaGuA2cWR1v3jJsuMJUozyIXDB3e793L8=" crossorigin="anonymous"></script>
<script>
if (!window.jQuery) {
                var script = document.createElement('script');
                script.src = '/local-resources/js/jquery-1.12.0.min.js';
                script.async = false;
                document.head.appendChild(script);
            }
</script>

你必须捕获错误并做任何必要的事情。

  • 创建并附加 MutationObserver
  • 添加回调
  • 捕获错误并采取相应措施

查看下面的两个示例。借什么有用的。向作者致以大大的感谢 ;-)

在这里你可以找到一个例子https://github.com/cyph/sri-fallback/blob/master/sri-fallback.js

这里有另一个很好的读物 https://aldaris.github.io/dev/security/2018/03/05/subresource-integrity.html

PS:window.onerror 可能不是最好的方法,您可能最终会遇到比预期更多的错误并陷入许多情况...