偶遇HTTP Referer

352 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

背景

线上页面被爬了,群里大佬说这个Referer搞得也太假了,我一看Referer是什么东西,之前也没听说过呀,赶紧百度了一圈。

Referer是啥

Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。举个栗子,就好比你在www.baidu.com 中点了某一个链接跳转到了目标页面,那么跳转到目标页面时http请求的head头里面Referer就是www.baidu.com ,如下图所示: image.png 有以下几种情况referer字段为空:

  • 浏览器地址栏直接输入url访问
  • 点击浏览器收藏夹直接访问
  • 浏览器设置关闭携带referer信息
  • 服务端curl不带referer头时

Referer作用

  • 跟踪用户访问信息
  • 比如只在本站内才展示的资源,可以通过Referer字段验证是否是站内打开的,用来做校验,当然这种校验是不准确的,因为http的head头信息可以通过curl随意修改。

控制Referer

有些情况我们不想带上Referer头,比如内网 URL,不希望外部用户知道内网有这样的地址。Referer字段很可能把这些 URL 暴露出去。这时我们想自己控制Referer展示信息。有一下几种方式控制:

rel="noreferrer"

在html标签上通过添加rel="noreferrer"属性来阻止http请求带有Referer信息。如下所示:

<a href="http://www.baidu.com" rel="noreferrer" target="_blank">baidu</a>

Referrer Policy

rel属性只能定制单个元素的Referer行为,只能选择发送或不发送。所以前端html增加了更强大的Referrer Policy。该属性使用方法如下所示:

  • HTTP 头信息
Referrer-Policy: origin
  • <meta>标签
<meta name="referrer" content="origin">
  • referrerpolicy属性
<a href="..." referrerpolicy="origin" target="_blank">...</a>

该属性的值有如下几种:

  • no-referrer (不发送Referer字段)
  • no-referrer-when-downgrade (如果从 HTTPS 网址链接到 HTTP 网址,则不发送Referer字段)
  • same-origin (链接到同源网址(协议+域名+端口 都相同)时发送,否则不发送。)
  • origin (Referer字段一律只发送源信息(协议+域名+端口),不管是否跨域。)
  • strict-origin (如果从 HTTPS 网址链接到 HTTP 网址,不发送Referer字段,其他情况只发送源信息。)
  • origin-when-cross-origin (同源时,发送完整的Referer字段,跨域时发送源信息。)
  • strict-origin-when-cross-origin (同源时,发送完整的Referer字段;跨域时,如果 HTTPS 网址链接到 HTTP 网址,不发送Referer字段,否则发送源信息。)
  • unsafe-url (Referer字段包含源信息、路径和查询字符串,不包含锚点、用户名和密码。)

页面重定向

通过页面重定向的方式来隐藏掉referer信息。先跳转到指定页面,页面参数是真正需要跳转的链接,在后端获取到真正需要跳转的链接后做重定向。这种方式不需要前端修改,后端也只需要写一个重定向接口即可,这是比较好的一种实践方式。如下所示:

<a  href="/reload?url=http%3A%2F%2www.baidu.com">baidu.com</a>