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

为何子资源完整性(Subresource Integrity)需要跨源资源共享(CORS)?

关于reCAPTCHA脚本加integrity就触发CORS失败的原因

关键逻辑:SRI验证需要读取资源内容,跨域读取默认被同源策略限制

你遇到的问题核心在于子资源完整性(SRI)的验证机制:当你给<script>加上integrity属性时,浏览器必须读取整个脚本的内容,计算哈希值后和你提供的integrity字符串对比,确认资源没被篡改。

但浏览器的同源策略默认禁止跨域读取资源内容——这是为了防止恶意站点窃取第三方资源里的敏感信息。不过,普通加载跨域脚本时,浏览器只是执行脚本,不会去读取脚本的文本内容,所以不需要任何CORS许可,这就是不带integrity的脚本能正常加载的原因。

为什么必须要服务器许可?

要完成SRI验证,浏览器就得打破同源策略的限制去读取资源内容,这时候就需要资源服务器通过CORS响应头(比如Access-Control-Allow-Origin)明确授权:允许你的站点读取这个资源的内容。如果服务器没返回这个头,浏览器就会直接阻断加载,避免潜在的安全风险。

谷歌这边的特殊情况

谷歌的reCAPTCHA脚本是动态生成的——不同请求返回的脚本内容可能不一样(比如适配不同地区语言、设备类型,或者包含会话相关的动态参数)。你指定的固定integrity哈希值根本不可能匹配所有动态生成的内容,所以谷歌干脆不允许站点对这个脚本做SRI验证,自然也不会返回对应的CORS授权头。

说白了:SRI验证需要读资源内容,跨域读内容必须服务器点头;而谷歌的这个脚本本身就不支持固定哈希验证,所以不会给你这个权限。

内容的提问来源于stack exchange,提问作者Gillespie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:42:14