给外部脚本加完整性校验,为什么标签里还要显式写跨域属性

📅 2026-10-11 👁️ 0

给外部脚本加完整性校验时,标签里还要显式写跨域属性,原因是校验依赖跨域请求这一前提。文档写明:由于请求带完整性校验的资源必须使用跨域请求,因此必须在标记里包含跨域属性。没有它时,浏览器对这类资源的取用方式与校验要求不一致,校验值就无从判定,结果往往是资源被直接拒绝加载,或者校验形同虚设。

校验发生在哪一步

它发生在资源下载之后、执行之前:浏览器算出内容的摘要,与标签里给的值比对,不匹配就不使用这份资源。它保护的是「引用没被换掉」这一段,也就是内容分发节点或外部脚本源被替换的场景,不保护脚本本身做了什么。被换掉的脚本往往正是跨站脚本(XSS)的入口,这条校验降低的是「加载到被动过手脚的文件」的概率,文件加载之后做了什么仍要靠来源限制来管。

所以它适合挂在版本固定的第三方脚本与样式上。会随内容变化的引用不适合加,因为每次源文件更新都会导致校验失败,页面直接缺样式或缺交互。

为什么必须显式写跨域属性

跨域属性决定了请求以什么模式发出。默认情况下,脚本与样式的取用不带完整的跨域语义,浏览器拿到的响应无法安全地参与摘要比对。显式声明后,请求按跨域模式发出,校验才有可比的输入。

最常见的事故是只加了校验值忘写跨域属性:本地测试时因为缓存命中看不出来,正式上线后才出现资源加载失败。反过来只写跨域属性不加校验,则完全没有校验效果。两类要成对出现。

写法要点 常见错误 出现时的表现
校验值与跨域属性成对 只给校验值 资源被拒绝加载,页面缺样式或无交互
多算法备选 只给单一摘要 源文件换算法后整站同时失败
版本固定引用 对动态内容加校验 每次更新都触发失败
批量替换后复核 只改脚本不改样式 一半引用仍走旧摘要

校验值的格式与备选

值是一份或多份内容摘要,以空白分隔。每份摘要由算法前缀、一个短横和编码后的哈希值组成,允许的前缀有 sha256、sha384 和 sha512 三种。同时给多个摘要的价值在于过渡:源文件在下一次更新时只要匹配其中任意一份就能正常加载,站点不需要在同一个发布窗口里同步换掉所有引用。

生成摘要时要以实际下发的文件为准,不要用压缩合并前的源文件;中间经过构建步骤的话,要在构建产物上取哈希,否则线上内容与计算基准不一致。

模板侧的批量核对

引用点通常散落在模板的公共头尾里,改一次要同时动脚本与样式。站内有全站替换工具,适合批量修这类引用点,但批量改完必须复核:替换是按文本匹配的,跨模板的写法差异(属性顺序、是否带其他参数)容易漏掉一部分。

更稳的顺序是先在测试站上跑一遍全站引用清单,把加了校验的资源逐个请求一次,确认摘要与产物一致,再上生产。模板改动如果同时借助站内的可视化模板编辑能力完成,改完仍要按同一份清单核对,编辑能力不会替你验证线上摘要。

常见问题

加了校验之后 CDN 换证书会不会失败? 不会,校验只比对文件内容摘要,与传输层证书无关;但 CDN 若对文件做了压缩改写,就会失败。

内部脚本要不要加? 同域且随构建变化的资源不必加,价值集中在固定版本的外部引用上。

校验失败会不会有提示? 浏览器控制台会记录,普通访客只看到功能缺失,因此灰度期要主动比对引用清单。

能长期只给单一算法吗? 可以,但换算法时要一次改完所有引用;给两份摘要能把过渡期拉开。

相关文章

内容安全策略先只上报不拦截,看什么再决定真的拦下来

内容安全策略先用只上报模式跑一段,用途是收集违规记录而不阻止执行,这是上线拦截规则前的灰度手段。报告目标有两种写法,支持新式的浏览器会忽略旧地址,兼容期要两处都写。本文说明灰度期看哪几类信息、什么时候切拦截,以及改模板时怎么避免页面白屏。

2026-10-11

上传大附件被挡在413,报错为什么在浏览器里看不明白

上传大附件时被网关挡下返回413,浏览器往往展示不出原因,因为限制设在请求进入应用之前,程序来不及接管。nginx 的这类上限默认是一兆左右,可按站点与位置分段设置。本文说明上限管的是哪一段、为什么报错难读,以及附件上传、批量导入与接口上传三类入口该怎么核对。

2026-10-11

删掉的文章和隐藏的栏目分别返回什么码,统一压成404会带来什么后果

内容删除或栏目隐藏时如果把状态码统一压成404,仍然存在的路径会被读成已失效。本文按删除、隐藏、拒绝、异常四类语义给出各自落点,并说明站内的回收站、草稿与待发布状态如何对应到前台返回,附一份口径对照表。

2026-10-11

定时发布的时间带了时区差,前台排序和推送会怎么乱

定时发布让内容在设定时间从待发布转为正式,时间带时区差会让上线时刻整体偏移,进而影响前台按发布时间排序和链接推送的时机。要先把待发布、正式、回收站三种状态的可见范围分清,再统一时区口径,并在备份恢复时连发布时间一起核对。

2026-10-11

网站前面挂了代理,日志里记到的客户端地址为什么全是代理

反向代理之后日志里只剩代理地址,是因为连接确实来自代理。真实来源要从转发头取,但这个头可以伪造,取值时必须只信可信代理追加的那一段。本文说明顺序、可信边界与部署侧的三步对齐。

2026-10-11

容器里跑建站程序时,程序端口和网关端口怎么对上

容器化部署建站程序要分三层端口:程序监听、容器映射、网关对外。本文以默认监听端口为例说明三层的对应关系、映射写错时的典型表现,以及反向代理需要补齐的请求头与部署后要核对的项目。

2026-10-11

线上体验站的后台入口在哪里,试用时该核哪几项能力

体验站的***息与后台入口路径在说明文档里写明,演示账号见 README 演示区。本文给出一份 30 分钟试用清单:内容模型与栏目、AI 对话与工具集、技能与意图目录、接入与审批、收录相关模块,并说明哪些结论不该在体验站上取。

2026-10-11

官网推荐的运行环境版本和最低能跑的版本差两档,按哪档配

同一个要求页里常有两档运行环境数字:一档建议主机支持的版本,一档是也能跑的兼容下限,后者后面往往跟着一句这些版本已进入官方停止维护期、可能把站点暴露在安全风险里。本文说明两档数字各自意味着什么、新站点为什么按推荐档配,并给出核对语言运行时、数据库与传输加密的三步顺序,以及换到编译型技术栈后哪几项限制会消失。

2026-10-10