rel="noopener"是安全底线,必须与target="_blank"共用以防止window.opener劫持;referrerpolicy仅对主动发起请求的标签(如)有效,大小写敏感;全局控制应依赖http响应头referrer-policy。

target="_blank"必须配rel="noopener noreferrer"
只加target="_blank"等于主动给新页面开后门。攻击者能用window.opener.location把你的原页面跳转到钓鱼页,甚至窃取登录态。
关键点:rel="noopener"是安全底线,强制让新页面的window.opener为null;rel="noreferrer"是隐私补充,同时阻止Referer头发送——但它在旧版Safari(≤12.0)里不保证window.opener为null,所以noopener不能省。
-
rel属性必须和target="_blank"一起出现才生效,单独写没用 - 不要写成
rel="noreferrer noopener",部分CMS或Markdown解析器只取第一个合法值,可能漏掉noopener -
window.open()不受rel控制,得用window.open(url, "_blank", "noopener")(注意:不是"noopener=yes",Chrome/Edge支持无参数写法) - 富文本编辑器、评论区、用户粘贴链接等场景,
target="_blank"常被自动加上,但rel几乎从不补全,这是真实高危区
referrerpolicy属性该加在哪些标签上
referrerpolicy只对「主动发起网络请求」的HTML元素有效,且仅影响这一次请求。它不是全局开关,不能写在里就一劳永逸。
支持的标签包括:<a></a>、<img>、<iframe></iframe>、<script></script>、<link>、<form></form>、<video></video>;不支持<div>、<code><p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/shouce/1862" title="使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件"><img
src="https://img.php.cn/upload/manual/000/000/010/170901721079108.gif" alt="使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/shouce/1862" title="使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件" class="overflowclass">使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件</a>
<p class="overflowclass">如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更</p>
</div>
<a rel="nofollow" href="/xiazai/shouce/1862" title="使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>等容器标签——写了也白写,浏览器直接忽略。
-
<img src="https://cdn.com/photo.jpg?x-oss-process=image/resize,p_40" referrerpolicy="no-referrer">:防图床因Referer校验返回403 -
<form action="/api/submit" referrerpolicy="origin"></form>:避免提交时泄露当前页完整路径(如?token=xxx) -
<iframe src="https://third-party.com" referrerpolicy="strict-origin-when-cross-origin"></iframe>:父页面任何设置都不影响iframe加载,必须单独写 - 值大小写敏感:
no-referrer有效,No-Referrer或no_referrer会被静默忽略
HTTP响应头Referrer-Policy才是全局兜底方案
前端加referrerpolicy只是补位,真正管得住所有请求的只有服务端返回的Referrer-Policy响应头。JS发起的fetch()、XMLHttpRequest、CSS/JS/字体加载、Service Worker请求……这些HTML属性完全管不到。
响应头优先级最高,会覆盖<meta name="referrer">和大部分元素级referrerpolicy(no-referrer除外)。CSP里的Content-Security-Policy: referrer no-referrer只能覆盖<meta>,盖不住响应头。
- Nginx配置示例:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;,always确保4xx/5xx错误页也生效 - FastAPI中间件中设:
response.headers["Referrer-Policy"] = "strict-origin-when-cross-origin" - 别用
unsafe-url:它强制发完整URL(含?token=xxx),生产环境禁止 -
strict-origin-when-cross-origin是当前最平衡的选择:同域发完整URL,跨域只发origin,HTTPS→HTTP降级时清空
为什么基本可以不用
<meta name="referrer">实际作用极小,只在页面解析完成后、由HTML自动触发的导航类请求中生效,比如点击未设策略的<a></a>、提交没写referrerpolicy的<form></form>、或加载<img src>。但它对以下场景完全无效:
-
fetch()、XMLHttpRequest等JS请求 - 页面初始加载时自动拉取的CSS/JS/字体(此时
<meta>还没解析) - 用户右键“在新标签页中打开链接”——浏览器直接忽略,走自身默认策略
- 从搜索引擎点击进来的首次访问——服务端响应头已发完,
<meta>根本没机会执行 -
window.location.href = "https://xxx"或location.replace()——完全无视
更麻烦的是,Safari对<meta name="referrer">支持弱,很多行为不一致。现在它已是遗留方案,真要控Referer,别碰这个标签。










