标签配合target="_blank"是唯一可靠方式,必须同时添加rel="noopener noreferrer"以防止window.opener劫持和referer泄露。

用 @#@#@#@#@#@#@#@#@#@0
-
target="_blank" 告诉浏览器新开标签页(或窗口,取决于用户设置)
-
rel="noopener noreferrer" 必须加,缺一不可:前者防 window.opener 劫持,后者避免泄露来源路径
- 不要写
onclick="window.open(...)"; return false —— 禁用 JS 的用户点不了,iOS Safari 可能静默失败,还丢掉了右键复制、中键打开等原生能力
rel="noopener noreferrer" 不是“建议”,是上线硬性要求
target="_blank" 告诉浏览器新开标签页(或窗口,取决于用户设置)rel="noopener noreferrer" 必须加,缺一不可:前者防 window.opener 劫持,后者避免泄露来源路径onclick="window.open(...)"; return false —— 禁用 JS 的用户点不了,iOS Safari 可能静默失败,还丢掉了右键复制、中键打开等原生能力rel="noopener noreferrer" 不是“建议”,是上线硬性要求只加 target="_blank" 会留下严重安全隐患:新页面可通过 window.opener.location.replace() 把你的页面跳转到钓鱼页,或执行脚本拖慢当前页。OWASP ZAP、SonarQube 等安全扫描工具会直接标红,运维/安全部门卡住上线是常态。
两个属性作用不同,不能省略任一个:
-
noopener:切断window.opener引用,新页拿不到原页上下文 -
noreferrer:不发送Referer头,防止泄露来源 URL(如含敏感参数)
注意:旧版 Safari 和部分邮件客户端对 rel 支持不一致,但广告位通常不在这些环境投放;若必须兼容,可用 JS 补漏(极少数场景),但纯 HTML 方案已覆盖 99% 主流环境。
图像热点(<area>)广告也支持相同逻辑
如果广告是图片映射(<map></map> + <area>),同样可以加 target 和 rel,但要注意几个易错点:
-
<area>必须带href属性,空值(如href="#")不会触发跳转 -
rel="noopener noreferrer"在部分旧浏览器中可能被忽略,稳妥起见,确保父级<map name="xxx"></map>与<img usemap="#xxx">的 name 值严格匹配(包括大小写和#前缀) -
coords值是像素坐标,HTML5 已废弃百分比写法,别混用
表单提交类广告按钮慎用 target="_blank"
如果广告包装在 <form></form> 里(比如带参数的推广表单),target="_blank" 虽然语法合法,但有明显缺陷:
-
<form></form>不支持rel属性,无法防护window.opener风险 - 后端若返回 JSON 或重定向响应,新标签页可能显示空白页或触发下载弹窗
- 仅适合内部页面跳转,且确认无安全审计要求时临时使用
真要提交数据再跳转,优先走 AJAX + window.open()(需确保在用户点击后立即调用,不加延时),但绝大多数广告场景没必要绕这么远——直接用 <a></a> 最干净、最安全、最可控。
广告弹窗真正的难点从来不是“怎么开”,而是“怎么不被拦”。所有自动触发(比如页面加载 3 秒后、滚动到底部、fetch 完成后)都不可信。唯一确定能过的,就是用户真实点击那一刻,用原生 <a></a> 发起的跳转。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











