第三方脚本被换掉后页面才会出错,完整性校验能挡到哪一步

📅 2026-10-11 👁️ 0

第三方脚本被换掉后页面才会出错,完整性校验能挡到哪一步?它能挡「内容和你声明的不一致」这一种:浏览器把取回的文件按指定算法算一次哈希,与你写在标记里的值比对,一致才加载,不一致直接拒绝并报网络错误。它挡不住「这个主机本来就在给你错的东西」。

校验防的是哪一种攻击

文档给出的定位很清楚:完整性校验是一种防御手段,用来确保应用取回的文件内容与你期望的完全一致。典型场景是外部主机被接管后往文件里注入内容——脚本仍然是同一个地址、同一个文件名,字节却变了。

这类攻击之所以有效,是因为多数页面的加载逻辑只看地址,不看内容。浏览器默认信任「从那个地址取回来的东西」,一旦被引用主机失守,问题就直接进入用户会话。校验把信任点从地址扩展到内容,代价是每次升级依赖都要同步更新那串值。

integrity 值怎么写、浏览器怎么比

写法是在引用外部资源的同时给出算法与前缀的 Base64 哈希,浏览器按同一算法计算实际内容,再与列出的值逐个比对;只要有一个匹配就加载,全部不匹配则拒绝加载并报网络错误。

两处细节最容易踩:

  • 跨域取资源时必须同时声明 CORS,标记里要带 crossorigin 属性。文档明确说明浏览器不允许 no-cors 的请求使用完整性校验,缺这一项的请求会直接失败,而不是降级为不校验。
  • 一份资源可以列多个值。灰度发布时把新旧两版哈希并列,能避免替换瞬间大面积报错,但这只是过渡手段,长期并列会让校验失去意义。

它挡不住的三类情况

第一类是主机本身不可信。校验只保证「拿到的是你指定的那份内容」,指定的内容如果本来就来自一个可以被随意更换对象的地址,攻击者换掉整份文件后同步更新引用值即可绕过。

第二类是同源路径下的替换。校验写在引用标记里,若脚本由站内动态拼接、或由同一台服务器上的其他程序覆盖,则内容变化与值更新可能同时发生。

第三类是合法内容被滥用。签名通过、内容正确,但脚本的执行行为本身超出你的授权范围——比如统计脚本把用户行为送去了不该去的地方,完整性校验完全不涉及这一层。

站内可控的部分是把依赖本地化。第三方脚本改成站内自托管后,引用地址不再受外部主机影响,剩余的校验点变成「谁有权限改这个文件」,这属于权限与备份范畴。内置的 XSS 防护处理的是内容注入,自托管处理的是来源失控,两层不要互相替代。

站内更稳的做法:把依赖本地化

顺序建议这样排:先列清单,把页面里所有非本站域名的脚本、样式与字体列出来;再逐个判断是否必须外部依赖,能本地化的本地化;剩下的保留外部引用但同时加校验与跨域声明;最后把清单纳入发布流程,新增外部依赖时强制说明理由。

清单应当跟着模板走,而不是靠记忆。模板里集中放引用位置,改一处即全站生效,比每个页面单独维护更可靠。

出问题后的恢复顺序

一旦校验失败或脚本被替换,处理顺序影响损失范围。

先断入口:把出问题的引用从模板里摘掉或改指本地副本,让页面先恢复可用。这一步优先级高于定位原因,因为校验失败通常表现为页面局部功能消失,用户侧仍在持续受影响。

再取现场:保留一份失败时的实际文件与响应头,作为后续比对与追责的依据。这一步容易被清缓存的动作覆盖,所以要在清理之前完成。

然后核对可回退的版本与数据:确认最近一次备份覆盖了模板与静态文件,能回到替换前的状态。恢复时按「先程序文件、再数据」的顺序验证,避免把脏文件带回干净数据上。

最后才做加固:把这条依赖改成本地副本、补充校验值、把引用清单写进发布检查项。

常见问题

问:所有脚本都加校验是不是最稳妥? 答:只对确实从外部主机取回的资源有意义。站内资源加了校验不增加防护,反而增加维护成本。

问:加了 crossorigin 会不会让部分用户取不到资源? 答:服务器不返回跨域允许头时,请求会失败。上校验前先用真实网络环境验证引用可用。

问:值多久更新一次? 答:跟随依赖版本更新,而不是按日历更新。定期批量刷新会让校验值和版本脱钩,出错时难以判断哪一份内容对应哪一串值。

相关文章

服务器软件份额里 Nginx 和 Apache 各有位置,建站选型看哪几项

份额统计给的是装机分布,不是适配结论。本文用一份公开的服务器软件统计说明这些数字统计了什么、为什么一个站点会被计入两次,并把选型回到伪静态规则、部署入口、内存占用与运维熟悉度这四项上。

2026-10-11

公开测量发现各生成式引擎引用来源的多样性差别很大,该怎么读

一项系统对比研究把自然搜索结果与三家提供方的五个生成式搜索系统放在一起测量,发现各引擎在依赖内部知识还是外部检索、以及来源多样性上差异明显。本文说明这组结论的正确读法,以及站内该把哪些路径做成机器可核验的形态。

2026-10-11

AI 爬虫的请求开始带加密签名,放行名单能不能不只看 UA

新的机器人验证方式用 HTTP 消息签名来证明抓取方身份,请求里要同时带三个签名相关首部,而 User-Agent 只是其中一项附带声明。本文说明可核验身份与可伪造字符串的差别,以及放行名单该写在哪一层、排除规则与防采集各自管什么。

2026-10-11

同一款程序的公告既有内部编号又有 CVE 编号,跟进以哪个为准

一条公告同时挂厂商内部编号和 CVE 编号时,两套编号的用途不同:CVE 适合跨产品检索和资产库比对,厂商公告才带受影响版本、修复分支和处置方案。本文用一份公开公告清单说明跟进该以哪一行为准,以及自研系统该怎样留出处。

2026-10-11

会话凭据的 SameSite 配到哪一档,跨站回跳会怎么受影响

SameSite 决定凭据在哪些请求里被带上:Strict 只允许同站来源,Lax 额外放行满足条件的顶层导航,None 允许跨站但必须同时声明 Secure。本文按这三档说明登录回跳断在哪一步,以及默认值为什么不能想当然。

2026-10-11

把永久重定向从 301 换成 308,表单提交的方法会不会被改掉

308 明确要求客户端在重定向请求里不修改方法与请求体;301 在规范上同样要求保持不变,但旧客户端会错误地改用 GET。本文说明换号能换来什么、换不了什么,以及改跳转前该先确认的目标形式。

2026-10-11

列表页图片换成新一代压缩格式,体积和抓取会一起变吗

官方文档给出的压缩读数是:有损新一代格式相比 JPEG 平均小约 50%,另一种常见格式平均小 25%—35%,无损场景约小 26%;同时明确建议保留回退格式。本文说明换格式后体积会降,但抓取读到什么取决于图片清单与替代文本,并给出站内落地顺序。

2026-10-11

开源协议写明是 GPL 时,改版和交付给客户要注意什么

以 WordPress 官方授权页为依据,GPLv2 或更新版本的要求覆盖衍生作品,插件与主题被官方视为衍生作品,同时存在法律灰区。本文说明对外交付时要带的三样东西、多站点与二次开发的分界,以及选型阶段的授权核对顺序。

2026-10-11