完整技术链路拆解:SSE 注入机制 × Fernet 加密归因 × OAIQ SDK 追踪 × 屏蔽方案
Part 1
OpenAI 已经在 ChatGPT 中上线了广告系统。 当你在 ChatGPT 聊天时,后台会根据你的对话内容,在模型回复的数据流中直接插入广告卡片。
4 月 28 日,安全研究员 Buchodi 发布了一篇技术调查报告,基于真实网络流量抓包,完整揭示了 ChatGPT 广告系统的工作原理。
这意味着:
① 你的对话内容被用来做广告定向投放
② 广告像模型回复一样自然地出现在对话流中
③ 点击后被加密 token 追踪,cookie 有效期 30 天
④ 已有真实广告主入驻:Grubhub、GetYourGuide、Canva、Gametime、Aritzia 等
Part 2
研究人员用同一个账号,在 6 个不同话题的对话中,收到了 6 个不同品牌的广告:
| 对话话题 | 投放品牌 | 广告内容 |
|---|---|---|
| 北京旅行(长城、故宫) | Grubhub | 中餐外卖配送 |
| 北京旅游预订 | GetYourGuide | 长城一日游 |
| 北京机票 | Axel | 航班预订 |
| NBA 季后赛 | Gametime | 赛事门票 |
| 春季时尚潮流 | Aritzia | 时尚服饰 |
| 效率工具 / PPT | Canva | 设计工具 |
投放逻辑:上下文定向(contextual targeting)
读取你当前对话内容来匹配广告主。目前没有证据表明利用了历史对话记录(但也不能排除)。
Part 3
当你发消息给 ChatGPT,后端打开 SSE 响应流:
chatgpt.com/backend-api/f/conversation
大部分事件是模型输出。但有些是广告单元:
关键细节:
• single_advertiser_ad_unit 是独立的类型化 schema,暗示还有 multi-advertiser 等变体
• 广告主 ID 格式为 adacct_<32-hex> —— 稳定的商户账号标识
• 素材(Logo + 配图)全部托管在 bzrcdn.openai.com,OpenAI 完全控制分发
• open_externally: false 表示链接在 ChatGPT 内置 WebView 中打开
Part 4
每个广告携带 4 个独立的 Fernet 加密 token,形成完整的归因闭环:
(Fernet = AES-128-CBC 加密 + HMAC-SHA256 完整性校验)
①
ads_spam_integrity_payload
SSE 数据内传输,不在点击 URL 中。服务端校验广告点击是否被伪造。
②
oppref
核心归因 token。写入 cookie __oppref(720h / 30天)。跟着你在商户网站的每一次操作。
③
olref
与 oppref 一起在 URL 上,但 SDK 不存储。用于 OpenAI 的出站链接日志。
④
ad_data_token
Base64 JSON 内嵌 Fernet token。SSE 载荷传输,用于点击时刻数据核对。
single_advertiser_ad_unit 广告对象oaiq.min.js(OAIQ SDK v0.1.3)bzr.openai.com🧪 有趣细节:研究人员抓到一个 Home Depot 广告点击——token 铸造时间 11:30:08 UTC,浏览器打开商户页面 11:31:43 UTC。点击延迟 95 秒。这意味着用户看到广告后犹豫了一分半才点——非常真实的人类行为。
Fernet token 的前 9 字节是公开的(版本字节 + 8 字节时间戳),所以铸造时间无需密钥即可提取:
Part 5
在广告拦截器或系统 hosts 中添加:
如果已经点过广告链接,检查并删除:
目前广告系统仅在 chatgpt.com 网页/App 端观察到。通过 API 调用模型暂未发现广告注入。
open_externally: false 意味着广告默认在 ChatGPT 内置浏览器打开。如需点击,复制链接到独立浏览器。
Part 6
Google 走过的路,OpenAI 也在走。
搜索结果里夹广告大家已经习惯了,AI 对话里夹广告……你习惯吗?
AI 对话和搜索有一个本质区别:人们对 AI 助手的信任度远高于搜索引擎。
你 Google 搜索时知道前几条是广告。但当你的 AI "助手" 在帮你规划旅行时突然推荐一个外卖 app——你能分清这是它的"建议"还是广告吗?
客观说,OpenAI 的实现是比较克制的:广告是独立数据类型(不是模型输出)、有明确品牌标识、使用加密追踪而非明文。
但"克制"和"可接受"是两回事。当广告和回答混在一起,信任会被稀释。