同意门控:未经同意,不运行任何可选功能
视频中的规则,一句话概括:在用户点击Cookie横幅的“接受”按钮之前,不加载任何跟踪像素、分析工具或第三方脚本。 一个在像素已经触发后才显示的横幅根本无法解决问题。本技能用于构建那个“等待”的机制。
非法律建议。切勿在代码、文案或报告中写入“完全合规”。应说明应用当前的行为和已通过测试的内容。
开始前的准备工作
- 先完成审计。 如果该应用没有
consent-audit报告,请先运行它。您需要一份完整的清单:有哪些供应商、它们在何处开始运行、它们发送了什么数据。 - 向应用所有者询问每个跟踪器的处理方式:保留、设门控,还是移除? 如果某个跟踪器不用于决策或广告,移除它比给它设门控更好。一个只使用必要存储的网站根本不需要任何横幅;请不要添加。
- 了解发布时将会包含哪些内容。 托管构建平台(如 Lovable 等)会一次性发布所有未发布的更改。列出这些更改,并在发布前获得许可。
- 保护第一方数据。 设门控的跟踪器不得触及登录、支付或应用自身的数据库写入操作(如学生作业、进度、表单)。请在报告中说明这一点。
“已设门控”的含义(修复措施必须满足的清单)
加载
- 一个中心加载器(
src/lib/consent.ts,参见references/consent.ts)。index.html、根布局或main.tsx中不得包含任何像素、GTM、gtag、PostHog 或回放<script>标签。 - 可选脚本不被获取,而不仅仅是不被初始化:动态
import()或脚本注入仅在用户选择加入后发生。 - 不重放已排队的事件:来自同意之前的页面浏览记录应被丢弃,不得延迟发送。
- 服务器端转发(Meta Conversions API、
/api/track、边缘函数)需检查相同的已存储选择,并在请求中一并发送。 - 在分析工具注入源(如 Lovable → 设置 → 访客分析关闭;Vercel/Netlify/Cloudflare 分析关闭)处关闭由主机注入的分析功能,或在其注入前进行门控。在脚本加载后再移除它已为时过晚,因为第一个请求已经发出。
- Google Consent Mode(如果保留 GA/Ads):
gtag('consent','default',{ad_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'})并且 gtag 脚本本身在本技能的默认设置下仍然等待用户选择加入。使用“基本”Consent Mode,而非“高级”,因为高级模式会在同意前发送无 cookie 的 ping。
横幅
- 接受可选和拒绝可选按钮同等显眼:相同的尺寸、相同的样式、相同的点击次数。另外还需提供设置选项。
- 类别开关(分析、广告等)默认处于未选中状态。
- 关闭横幅(点击 X / 按 Escape)视为拒绝。
- 用户的选择需连同版本号和过期时间(6至12个月)一起保存。供应商列表发生变化时,版本号递增,并重新征求同意。
- 页脚中有一个持续的**“隐私选择”**链接,可重新打开设置。
- 撤回操作会停止未来的调用,并删除应用拥有的可选 Cookie 和存储(
_ga*、_fbp、_gcl_au、_ttp、ph_*、ajs_*、_hj*、_clck),但不影响身份验证。 - 全球隐私控制(
navigator.globalPrivacyControl === true)对于广告/销售/共享行为视为拒绝,并且横幅应声明已遵循该设置。
即使在同意后,也不发送的内容
- 像素或分析工具的数据包中不得包含电子邮件、电话号码、姓名或出生日期(不得使用 Meta advanced matching,不得使用
identify(email))。只在确实需要时使用不透明 ID。 - 发送的 URL 不得包含
?query和#fragment(例如礼品码、重置令牌、搜索词)。如果供应商无法剥离这些内容,则移除该供应商。 - 不得发送来自测验答案、聊天内容、健康/金融/出生数据或表单字段的任何内容。
- 视频页面: 在播放课程或教学视频的页面上不得存在广告像素(涉及联邦视频隐私保护法风险),除非法律顾问另有指示。
通知
- 在一个公开路由上放置隐私/Cookie 通知,该路由可从页脚以及注册/登录页面链接到,其中列出实际的供应商和类别。仅使用真实运营商的名称和联系邮箱;不得虚构地址、DPO 或法律声明。
如何实施
- 本地代码 / Claude Code: 将
references/consent.ts复制到应用中,将每个可选供应商注册为一个loader,删除硬编码的标签,使用应用自身的组件构建横幅,并连接页脚链接。保持差异尽量小,并符合应用自身的样式。 - Lovable / Bolt / v0 / Replit(代理构建): 从
~/.claude/skills/consent-audit/references/prompts.md(或移除提示)粘贴修复提示。然后亲自验证;不要相信代理的总结。
验证(在宣布完成前必须执行)
先在预览环境中运行以下测试,发布后在生产 URL 上再次运行。在 Claude 的内置浏览器中,使用已清除存储的新标签页,然后使用 read_network_requests 和 javascript_tool(document.cookie、localStorage):
| 测试 | 通过条件 |
|---|---|
| 全新访问,无点击 | 对广告、分析或回放域名的请求数为 0;无可选 Cookie 或存储 |
| 拒绝,然后进行 2 次页面导航 | 请求数仍为 0;横幅不再显示;选择已保存 |
| 仅接受分析 | 分析工具加载;广告像素不加载 |
| 重新加载 | 选择被记住;横幅不再显示 |
| 通过页脚链接撤回 | 未来调用停止;可选 Cookie 被清除;用户仍处于登录状态 |
GPC 开启(navigator.globalPrivacyControl 强制设为 true) | 无需点击,广告即被拒绝 |
| 客户端导航(SPA) | 路由切换时无跟踪器潜入 |
| 使用测试账号登录 | 任何跟踪器请求中均无电子邮件或用户 ID |
| 构建 + 类型检查 | 通过 |
报告内容:修改的文件、每项测试的结果及证据(观察到的域名或“无”)、未运行的测试及原因、随此修复一并发布但尚未更改的内容,以及“非法律建议。如果您投放广告或为加州/欧盟用户提供服务,请咨询法律顾问。”