Subresource Integrity:不是加了就生效的安全开关 开门见山,先说核心结论:很多人以为给资源加上 integrity 属性就万事大吉,仿佛开启了一个自动安全开关。但现实是,如果漏配了 crossorigin、用本地文件计算哈希,或者CDN返回了非标准响应体,校验都会静默失效——最糟

开门见山,先说核心结论:很多人以为给资源加上 integrity 属性就万事大吉,仿佛开启了一个自动安全开关。但现实是,如果漏配了 crossorigin、用本地文件计算哈希,或者CDN返回了非标准响应体,校验都会静默失效——最糟糕的是,页面白屏了,控制台却可能连个像样的错误提示都没有。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
最常见的原因,是缺少了 crossorigin 属性。这里有个关键机制:浏览器一旦发现 integrity,就会强制对该资源发起CORS(跨源资源共享)请求。但如果资源服务器没有返回正确的 Access-Control-Allow-Origin 头,或者开发者没有显式声明 crossorigin,浏览器就拿不到完整的响应体进行比对,哈希校验流程压根不会启动,integrity 属性也就被直接忽略了。
integrity 和 crossorigin 必须同时存在,缺一不可。crossorigin="anonymous":适用于绝大多数公开CDN(如 cdn.jsdelivr.net、code.jquery.com)。crossorigin="use-credentials":仅当你的后端要求携带登录态(如Cookie)访问静态资源时才使用,并且后端必须配合返回 Access-Control-Allow-Credentials: true 以及明确的 Access-Control-Allow-Origin(不能是通配符 *)。哈希值必须基于目标URL实际返回的响应体来计算。这可不是你本地下载的.js文件,也不是HTML源码里内联的内容。CDN可能返回gzip压缩后的内容、带BOM头的UTF-8编码、或者经过重定向后的最终资源——这些细微差别都会导致哈希值对不上。
curl -sL https://cdn.example.com/jquery.min.js | openssl dgst -sha384 -binary | openssl base64 -A-sL 参数确保curl跟随重定向并静默输出;openssl 默认对解压后的明文内容进行哈希(这与浏览器的行为保持一致)。https://www.srihash.org/)本质也是调用curl+计算哈希,但无法控制重定向和编码细节,一旦出问题,排查起来更困难。curl 默认不会处理,但浏览器校验的始终是解压后的明文。因此,上述命令依然适用。SRI规范目前只作用于 和 这两类标签。其他所有资源加载方式都不受保护。
立即学习“前端免费学习笔记(深入)”;
fetch()、XMLHttpRequest、import() 动态导入:完全不识别 integrity 属性。document.createElement('script') 动态创建并设置 src:即使手动添加 integrity 属性,浏览器也不会执行校验。、![]()
、:均不支持,SRI规范尚未覆盖这些元素。onerror 事件。控制台只会报一个模糊的错误:Failed to find a valid digest in the 'integrity' attribute,这时你需要逐个检查所有带 integrity 属性的标签。还有一个极易被忽略的细节:当页面存在多个带 integrity 的 标签时,只要其中任何一个校验失败,对应的脚本就会彻底“消失”,并且没有自动的fallback机制。因此,在部署到线上环境前,务必使用真实的URL配合 curl 命令来验证哈希值,不要相信本地文件或缓存副本。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述