安全指南

安全管理第三方脚本:清点、SRI、CSP 与表单提交目标的检查

统计和广告等第三方脚本以网站自身的权限运行。整理清点、删除不用的标签、SRI,以及 CSP script-src、connect-src、form-action 的设置与检查。

发布于 2026-10-31 更新于 2026-10-31 最后核实 2026-10-31 4 分钟阅读
本页目录

统计分析、广告、在线客服、支付组件、从 CDN 加载的库。很多网站在每次显示页面时都会加载并非自己编写的脚本,而这些脚本以与网站自身代码相同的权限运行。本文依据 OWASP 与 MDN 的一手资料,说明如何掌握正在运行的外部脚本、限制它们能做的事,并及时发现变化(不介绍攻击方法)。

为什么第三方脚本是风险

OWASP 的《Third Party JavaScript Management Cheat Sheet》把嵌入第三方 JavaScript 的风险分为三类。

OWASP 列出的三类风险
失去对变更的控制
通常无法保证提供方的代码与开发、测试时保持一致。提供方随时可以推送新功能
在用户设备上执行任意代码
第三方代码在加入前很少被审查,并以与用户相同的权限运行。OWASP 还举了提供方域名过期后被他人重新注册、放上恶意代码的例子
向第三方泄露信息
加载脚本时,浏览器直接连接提供方的服务器,IP 地址以及提供方之前设置的 Cookie 等也会送到提供方

使用标签管理器时情况更复杂。OWASP 说明,标签管理器返回的内容可以在其管理界面中修改并立即生效,下一次页面显示就会运行修改后的代码。因此,只看网站的源代码无法知道实际运行的全部代码。

本站也报道过这类事件:Polymarket 第三方脚本事件。问题出在用户正在查看的页面里运行的代码。

自己网站的页面(显示内容、表单输入、Cookie)

↓ 在同一页面中运行

自己的脚本

可以自己审查和提供

第三方脚本

提供方可以修改内容,能读取页面

向外部提交的表单

输入会送到其他源

↓ 限制手段

清点与删除

SRI / 自行托管 / CSP script-src、connect-src

CSP form-action

页面中运行的内容,以及分别限制它们的手段(一般对应关系)

防御方法:6 个步骤

1

列出所有正在运行的第三方脚本

第一步是建立清单。包括直接写在 HTML 里的脚本、在标签管理器中配置的标签,以及库或插件自行加载的内容。

逐项记录:从哪个源加载、属于谁的服务、为什么加入、在哪些页面运行、出问题时由谁用什么方式停用。iframe、图片等会连接外部服务器的资源也一并列出,这份清单之后可以直接用于 CSP 配置。

2

删除不用的,在重要页面上进一步精简

清单中“用途不明”“没有负责人”的项目就是删除候选。以前活动用的标签、已经换掉的统计服务常常还留着。

登录、支付、修改密码或邮箱、管理后台等输入价值高的页面,只保留必需的脚本。放进全站通用模板的标签也会出现在这些页面,所以请按页面类型决定是否加载。对于不需要接触页面内容的组件,OWASP 介绍了放入其他域名的 iframe(带 sandbox 属性)与页面隔离的方法。

3

限制标签管理器的发布权限

OWASP 提醒,数据层(汇总传给标签的值的对象)不是隔离机制,标签管理器的容器可以执行自定义 JavaScript 和 HTML 标签。并建议限制发布权限,像对待应用代码一样审查变更。

具体可从四件事开始:只让少数人能发布,为管理界面的账号开启双重验证,不需要时禁用自定义 HTML 标签,发布前由另一个人确认。

4

为内容固定的文件加 SRI,或从自己的网站提供

SRI(子资源完整性)是在 <script> 等元素的 integrity 属性中写入文件哈希,浏览器收到的文件不一致时拒绝加载的机制。根据 MDN,可用的哈希是 sha256、sha384、sha512;跨源加载时提供方需要允许 CORS,并加上 crossorigin 属性。

SRI 只适用于带版本号的库这类内容不变的文件。用在提供方随时更新的统计标签上,每次更新都会导致无法加载。这种情况下,可以从自己的网站提供审核过的版本(OWASP 所说的 in-house mirroring),或在重要页面上不加载。库的已知漏洞可以把 lockfile 贴到依赖包漏洞扫描器中检查。

5

用 CSP 限制加载来源和发送目标

在 CSP(Content-Security-Policy)中,根据第 1 步的清单写入允许的源。script-src 限制脚本的加载来源,connect-src 限制 fetch、XMLHttpRequest、WebSocket、EventSource、sendBeacon 等的连接目标(MDN)。

限制表单提交目标的 form-action 不会回退到 default-src。MDN 说明不设置就允许任何目标。如果表单只提交到自己的网站,请明确写 form-action 'self'。

直接强制执行可能让正常功能停止,所以先用 Content-Security-Policy-Report-Only 只收集违规报告。MDN 指出,要接收报告需要指定 report-to,并且这个响应头不能在 <meta> 元素中使用(已弃用的 report-uri 也仍可发送报告)。可以用 CSP 构建器试着组合。响应头整体的思路见安全响应头的选择方法。

6

让变化可被发现,并事先决定停用步骤

第三方脚本即使你什么都不做也会变化。按固定间隔(例如每月一次)把清单与实际状态对比;CSP 违规报告中出现陌生的目标时进行调查;订阅提供方的安全通知。

把出问题时由谁、在哪个界面停用哪个标签写成文档。有银行卡支付页面的经营者,还请确认 PCI DSS v4.0.1 中关于支付页面安全的要求 6.4.3 和 11.6.1 已于 2025 年 3 月 31 日起生效(PCI SSC)。对于把账户数据处理全部外包给合规第三方、使用 SAQ A 的商户,这两项要求被替换为一项资格条件:确认自己的网站不易受到可能影响电子商务系统的脚本攻击(标准本身的要求不变)。

四种措施能防什么、不能防什么

措施能防止不能防止适用对象
删除与该脚本有关的所有风险―用途不明或不再使用的脚本
SRI传输途中或提供方处的文件替换未被篡改的脚本在正常功能中发送的信息。提供方更新后无法加载带版本号的固定文件
自行托管提供方处的替换不自己更新就会留下旧版本审核后继续使用的库
CSP从未允许的源加载、向未允许的目标通信或提交表单已允许的源本身被入侵。发送到已允许目标的信息所有页面(分阶段引入)

容易扩散的状态

  • 把标签放在全站通用模板中
  • 很多人拥有标签管理器的发布权限
  • 没有 CSP,或没有写 form-action
  • 没有第三方脚本清单,也没定好停用方法

已经收紧的状态

  • 按页面类型区分加载的标签
  • 能发布的人有限,变更由另一人确认
  • 用 CSP 固定加载来源、连接目标和表单提交目标
  • 有清单,并定期与实际状态对比

用网站透明度检查器确认结果

建好清单后,与实际状态对比。把你管理的网站首页 URL 输入网站透明度检查器,它会从获取到的 HTML 中提取以下项目。

结果的看法
外部脚本 / 资源的来源
script、iframe、img、link(stylesheet、preload 等)引用的其他源。不在第 1 步清单中的,要查明用途
解析 / 广告标签(跟踪)
按名称显示常见的统计、广告、监控服务。名称只是对引用目标的分类,不是安全判定
未知的第三方脚本(可能读取输入)
从其他源加载的脚本。不会因为提供方知名就判定安全
向外部提交的表单
form 的 action 或 button 的 formaction 指向其他源。若非有意,应最优先确认,并用 CSP 的 form-action 固定
设置了 Cookie
获取到的响应中是否有 Set-Cookie。不检查由 JavaScript 设置的 Cookie

这个工具有局限。它只获取首页(包括各语言首页和 index.html),不执行脚本,也不额外获取嵌入的文件。标签管理器之后加载的脚本、只在按下按钮时才发生的请求都看不到。因此还要同时做以下确认。

  1. 打开要检查的页面(包括登录和支付页面),打开浏览器的开发者工具
  2. 在 Network 面板中记录,用测试数据实际输入和操作
  3. 查看是否有发往清单之外外部域名的请求
  4. 设置 CSP 后,用安全响应头检测确认响应头确实被返回

在日本运营网站时:外部发送规则

根据日本总务省的说明,2022 年 6 月修订的《电气通信事业法》设立了规则:通过标签或信息收集模块把用户信息发送到外部时,要让用户能够确认(2023 年 6 月 16 日施行)。适用对象是经营电气通信事业者;总务省把消息传递服务、社交网络、搜索服务,以及新闻网站、汇总网站等信息提供服务列为主要对象,同时说明自家商品的网上销售、企业官网和个人博客不属于电气通信事业,不在适用范围内。

适用时,需要把发送的信息内容、处理该信息者的姓名或名称、使用目的通知用户,或置于用户容易知道的状态等。第 1 步的清单也可以用来编写这些公开内容。是否适用,请参照总务省的说明和流程图确认。

本站观点:不看知名度,看它在该页面能读取什么

检查第三方脚本时,常会得出“是大公司的服务所以没问题”的结论。但 OWASP 列为最大的风险,正是提供方的服务器被入侵。越是知名的服务,被越多网站使用,被入侵时影响也越广。

所以本站的网站透明度检查器不会因为提供方知名就显示为安全。判断标准是三点:脚本在哪些页面运行、在那里能读取什么、出问题时几分钟内能停用。

资料来源(一手资料)

  • OWASP《Third Party JavaScript Management Cheat Sheet》— cheatsheetseries.owasp.org(三类风险、标签管理器、SRI、iframe 隔离、in-house mirroring)
  • MDN《Subresource Integrity》— developer.mozilla.org(integrity 属性、可用哈希、CORS 与 crossorigin 属性)
  • MDN《Content Security Policy (CSP)》— developer.mozilla.org(script-src、report-only 试行)
  • MDN《CSP: form-action》— developer.mozilla.org(没有 default-src 回退)
  • MDN《CSP: connect-src》— developer.mozilla.org(涵盖的 API)
  • MDN《Content-Security-Policy-Report-Only》— developer.mozilla.org(需要 report-to,不能用于 meta 元素)
  • PCI SSC《Important Updates Announced for Merchants Validating to Self-Assessment Questionnaire A》(2025 年 1 月 30 日)— blog.pcisecuritystandards.org(要求 6.4.3、11.6.1 自 2025 年 3 月 31 日起生效)
  • 日本总务省《外部送信規律》(日文)— soumu.go.jp(宗旨、对象、公开事项)

接下来阅读

FAQ

Q像大型统计分析服务这样知名服务的脚本就安全吗?
A

知名并不能保证代码不会被篡改。OWASP 的《第三方 JavaScript 管理备忘单》把最大的风险描述为第三方 JavaScript 服务器被入侵、恶意代码被注入原本的标签。加载到页面的外部脚本还拥有与用户相同的权限。请根据它在该页面能读取什么、能否迅速停用来判断,而不是看提供方的知名度。

Q加上 SRI(integrity 属性)就够了吗?
A

不够。SRI 会在文件与事先写好的哈希不一致时让浏览器拒绝加载,因此只适用于内容不变的文件。提供方正常更新文件后就无法加载(OWASP 也提醒过这一点)。而且 SRI 不限制未被篡改的脚本在正常功能中发送什么。请与 CSP 以及删除不需要的脚本结合使用。

QCSP 设置了 default-src,表单的提交目标也会受限吗?
A

不会。MDN 说明 form-action 没有 default-src 回退,不设置就允许任何目标。要限制表单提交目标,请单独写 form-action。相对地,限制 fetch、XMLHttpRequest、WebSocket、sendBeacon 等的 connect-src 在未设置时会使用 default-src。

Q网站透明度检查器什么都没检测到,就能说没有向外部发送数据吗?
A

不能。该工具静态检查所获取的首页等页面的 HTML,不执行脚本,也不额外获取嵌入的文件。标签管理器之后加载的脚本、只有在用户点击时才发生的请求都看不到。请把结果当作“静态检查未发现”的线索,最终用浏览器开发者工具的 Network 面板确认。