You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用JavaScript记录客户端Subresource Integrity错误?

子资源完整性(SRI)错误拦截及检测方案

你可以通过页面内JavaScript实现SRI校验错误的拦截,也可以主动检测带无效integrity属性的资源节点,具体实现方法如下:

方法1:全局监听error事件捕获SRI校验错误

SRI校验失败时,对应的资源(script、link标签)会触发error事件,只需开启事件捕获模式即可全局监听这类错误:

// 第三个参数设为true开启捕获模式,才能拿到元素级别的error事件
window.addEventListener('error', event => {
  const target = event.target
  // 筛选带integrity属性的资源标签
  if (
    (target instanceof HTMLScriptElement || target instanceof HTMLLinkElement) &&
    target.hasAttribute('integrity')
  ) {
    console.log('SRI校验失败资源信息:', {
      资源地址: target.src || target.href,
      预设integrity值: target.getAttribute('integrity')
    })
    // 此处可添加自定义降级逻辑,比如替换为备用资源
  }
}, true)

你提到的两类哈希不匹配错误都会触发上述回调,该方法同时支持静态写在页面内和动态插入的SRI资源。

方法2:主动批量检测页面现有SRI资源有效性

如果需要主动排查页面所有带integrity属性的资源是否校验通过,可以在DOM加载完成后遍历节点检测:

// 检测所有SRI资源加载状态
function checkAllSriResources() {
  // 筛选所有带integrity属性的script和样式link标签
  const sriElements = [
    ...document.querySelectorAll('script[integrity]'),
    ...document.querySelectorAll('link[integrity][rel="stylesheet"]')
  ]

  sriElements.forEach(el => {
    // 未加载完成的资源绑定error监听
    el.addEventListener('error', () => handleSriFail(el), true)
  })
}

function handleSriFail(el) {
  console.log('检测到无效integrity属性的资源:', el.src || el.href)
  // 自定义处理逻辑
}

// DOM加载完成后执行检测
document.addEventListener('DOMContentLoaded', checkAllSriResources)

注意事项

  • 如果需要严格区分SRI校验失败和其他资源加载错误(如网络超时、404),可以主动拉取资源内容计算哈希值,和integrity属性值做对比即可确认错误类型
  • 动态插入SRI资源时,创建元素时直接绑定error监听即可实现针对性捕获

内容的提问来源于stack exchange,提问作者James W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:54:00