test(sdk): track宿主伪造归属键被快照覆盖的权威性回归

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-18 23:57:39 +08:00
parent fea19c15cd
commit 8d7fc99ef6
+39
View File
@@ -152,6 +152,45 @@ describe("index 入口", () => {
expect(ev.grant_ref).toBe(null);
});
it("track 归属权威性回归(T5 审查遗留):宿主伪造归属键被快照覆盖,业务字段原样保留", async () => {
await loadSdk([["init", { siteId: "site-auth", endpoint: "/e", flushMs: 60000 }]]);
g.ctk!("track", {
event_id: "e-evil",
event_name: "page_stay",
occurred_at: new Date().toISOString(),
path: "/x",
title: "t",
properties: {},
site_id: "evil-site", // 宿主伪造归属键:spread 宿主在前、归属在后(index.ts track 分支)
session_id: "evil-sess",
});
g.ctk!("flush");
// 信封 site_id 恒取 init 配置(transport.envelope 读 cfg.siteId)——
// 伪造的 evil-site 批次根本不存在
expect(bodiesOf("evil-site")).toHaveLength(0);
const bodies = bodiesOf("site-auth");
expect(bodies).toHaveLength(1); // 伪造键被覆盖 → 与 page_view/sdk_loaded 同四元组,单组子批
const evs = bodies[0].events;
expect(evs.map((e: { event_name: string }) => e.event_name)).toEqual([
"page_view",
"sdk_loaded",
"page_stay",
]);
const ev = evs[2] as Record<string, unknown>;
// 事件归属四元组来自 PageSession 快照(非宿主伪造值)
expect(ev.site_id).toBe("site-auth");
expect(ev.session_id).toMatch(UUID_RE);
expect(ev.session_id).toBe(evs[0].session_id); // 与初始 page_view 同会话(非 evil-sess)
expect(ev.visitor_id).toBe(evs[0].visitor_id);
expect(ev.page_id).toBe(evs[0].page_id);
// 信封归属同取分组键(事件顶层快照字段):亦非伪造值
expect(bodies[0].session_id).toBe(evs[0].session_id);
// 宿主业务字段不被归属展开覆盖
expect(ev.event_id).toBe("e-evil");
expect(ev.properties).toEqual({});
});
it("init 接线 business(T5):产品页路径下队列 [page_view,sdk_loaded,product_view];wa.me 点击 → contact_click beacon 冒烟", async () => {
setUrl("/product/hydraulic-press-100t/");
await loadSdk([["init", { siteId: "site-biz", endpoint: "/e", flushMs: 60000 }]]);