ping属性必须与合法href共存才能触发广告点击统计,单独使用无效;需为完整http(s) url,且仅chrome部分支持、firefox需手动开启、safari完全不支持,后端须严格校验content-type、ping-from头并限速。

ping属性必须和合法href共存才能触发广告点击统计
单独写ping没用,浏览器直接忽略。广告链接必须同时满足:有真实可跳转的href(不能是javascript:void(0)、#或空字符串),且href值是完整 HTTP(S) URL。
- ✅ 正确:
@#@#@#@#@#@#@#@#@#@0 - ❌ 无效:
@#@#@#@#@#@#@#@#@#@1(#不是可导航 URL) - ⚠️ 注意:Vue/React 中用
@click拦截后router.push(),ping完全不触发——它只响应原生点击导航行为
Chrome/Firefox 可用但 Safari 完全不支持
别在前端做 feature detection,"ping" in document.createElement("a")返回true不代表能用。Safari(截至 2026 年 8 月)从未实现该特性,且无启用计划;Firefox 默认禁用,用户需手动开启network.ping.enabled;Chrome 虽默认开启,但在 iframe 第三方上下文(如嵌入广告位)中会屏蔽。
- 实际覆盖≈Chrome 桌面用户 + 少量 Firefox 用户,iOS/macOS Safari 用户 0%
- 不要依赖 UA 字符串做前端适配——UA 可伪造,且后端日志里根本看不到 Safari 的请求
- 如果广告投放要求全平台统计,
ping只能作为补充,不能替代 JS 监听方案
后端接收 ping 请求必须校验 Content-Type 和 PING-FROM 头
浏览器发的请求是 POST,Content-Type: text/ping,请求体固定为字符串"PING",但攻击者可伪造任意头。不校验就等于开放 SSRF 入口。
- 必须拒绝非
text/ping的Content-Type(如application/ping、text/plain) - 必须解析并校验
PING-FROM头:需为合法 HTTP(S) URL,且不能含内网地址(如http://192.168.1.100、http://localhost) - 必须限速:单 IP 每分钟最多 3 次,超限返回
429 Too Many Requests且响应体为空 - 不要解析请求体——标准行为下它就是
"PING",若收到其他内容,应记录告警并丢弃
同源 ping 会静默携带 Cookie,暴露登录态和内网路径
如果广告点击日志 endpoint 是同域(比如ping="/api/log"),浏览器会自动带上当前域所有 Cookie,包括用户 session token。这相当于一次未授权的带身份调用。
- 风险场景:企业内网页面嵌了第三方 banner,banner 的
ping指向同域日志接口 →PING-FROM头暴露完整内网 URL(如https://intranet.company.local/report?user=admin) - 缓解方式:日志 endpoint 必须设为独立子域(如
log.yourapp.com),且明确设置SameSite=Strict、Secure、HttpOnly,后端显式忽略Cookie头 - 别指望
referrerpolicy能控制PING-FROM——它不受影响,始终携带完整来源 URL
真正难的不是写那行ping属性,而是后端能否扛住伪造请求、前端能否接受 Safari 零覆盖、以及业务是否允许“只知点了谁,不知是谁点的”这种粗粒度数据。它适合做外链曝光归因的旁路补漏,不适合当核心埋点通道。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











