在什么情况下HTTP_REFERER会为空?

201

我知道可能会获取到一个空的HTTP_REFERER。在什么情况下会出现这种情况?如果我获取到一个空的referer,是否意味着用户已更改它?获得空的referer是否与获得null的相同?以及在什么情况下我会获得null的referer?


9
当客户端未发送时。 - Ignacio Vazquez-Abrams
5个回答

334

当最终用户使用时,它可能为空或部分为空。

  • 在浏览器地址栏中输入网站URL。
  • 通过浏览器已保存的书签访问该网站。
  • 在某些浏览器中,将该网站作为新窗口/选项卡/会话的第一个页面。
  • 在具有限制性<meta name="referrer">标记的页面上单击链接。
  • 在具有限制性Referrer-Policy头的页面上单击链接。
  • 单击具有rel="noreferrer"的链接。
  • 在外部应用程序(即非Web浏览器,例如Flash)中单击链接。
  • 从https URL切换到http URL。
  • 安装了安全软件(防病毒/防火墙等),其从所有请求中删除引荐者。
  • 位于剥离所有请求的代理后面。
  • 以编程方式访问该网站(如curl),而不设置引荐者标头(机器人!)。

36
您可能需要添加“当用户从安全(HTTPS)页面转换到不安全页面时”的内容。 - John Pick
4
“visited the site as first page in the window/tab.”即“在窗口/标签页中访问了该网站的第一页。” 即使是通过点击链接并在新窗口/标签页中打开,也是这样吗?你确定吗?那将是浏览器非常错误的行为。 - matteo
6
“从一个https URL切换到另一个https URL”。您确定吗?:\ - Oscar Mederos
7
默认情况下,从一个 HTTPS URL 切换到另一个 HTTPS URL 会设置完整的 referer。但是这个默认政策可以被覆盖。https://www.w3.org/TR/referrer-policy/ - Dhaval Kapil
1
刷新页面(F5)不也会显示空的引荐来源吗?还是我错了? - AaronLS
显示剩余16条评论

37

HTTP_REFERER - 由浏览器发送,指示浏览器查看的最后一个页面!

如果您以任何重要原因信任[HTTP_REFERER],则不应该,因为它可以轻松伪造:

  1. 一些浏览器限制访问,不允许传递HTTP_REFERER
  2. 在地址栏中输入地址不会传递HTTP_REFERER
  3. 打开新浏览器窗口将不会传递HTTP_REFERER,因为HTTP_REFERER = NULL
  4. 有一些浏览器插件出于隐私原因阻止它。一些防火墙和杀毒软件也是如此。

尝试使用这个Firefox扩展,您将能够设置任何标头:

@Master of Celebration:

Firefox:

扩展:refspoofrefontrol modify headersno-referer

完全禁用:选项在about:config下可用,"network.http.sendRefererHeader"并将其设置为0以禁用referer传递。

Google Chrome / Chromium:

扩展:norefspoofyexternal noreferrer

完全禁用:更改~/.config/google-chrome/Default/Preferences或~/.config/chromium/Default/Preferences并设置以下内容:

{
   ...
   "enable_referrers": false,
   ...
}

或者在快捷方式或命令行中添加 --no-referrers:

google-chrome --no-referrers

Opera:

完全禁用:设置 > 首选项 > 高级 > 网络,取消选中 "发送引荐来源信息"

伪装 Web 服务:

http://referer.us/

独立的过滤代理(欺骗任何头部):

Privoxy

使用 wget 时欺骗 http_referer

‘--referer=url’

使用 curl 时欺骗 http_referer

-e, --referer

使用 telnet 欺骗 http_referer

telnet www.yoursite.com 80 (press return)
GET /index.html HTTP/1.0 (press return)
Referer: http://www.hah-hah.com (press return)
(press return again)

Tamper Data 是另一个值得一试的 Firefox 扩展程序,如果你想尝试更改 referrer 值的话。 - Chris Hepner
我一直在努力想起它的名字,但我的记忆背叛了我。谢谢 :) - ThatGuy
@nix “有些浏览器限制访问,不允许传递HTTP_REFERER”,您能否举个例子或扩展程序? - Master of Celebration
@MasterofCelebration 在我的回答中添加了欺骗 http_referer 的方法。 - ThatGuy
请勿使用 referer.us 来欺骗/隐藏您的引荐者!它无法正常工作,并会泄露您的信息。目前唯一可用的服务是这个免费的隐藏引荐者服务。 - Brian Smith

11

如果使用新Referrer Policy标准草案,请求来源将不会发送引用页头信息,并且该页也将为空。例如:

<meta name="referrer" content="none">

虽然Chrome和Firefox已经实现了一个草案版本的Referrer Policy,但你应该小心使用它,因为例如Chrome期望使用no-referrer而不是none(我也在某些地方看到过never)。


浏览器兼容性表格:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy - djvg

9

BalusC的名单很有实力。这个领域经常出现空白是因为用户在代理服务器后面。这类似于在防火墙后面,但略有不同,因此我想为了完整性而提及它。


0

我发现浏览器的引用实现非常不一致。

例如,带有“download”属性的锚元素在Safari中按预期工作并发送引用,但在Chrome中,Web服务器日志中的引用将为空或为“-”。

<a href="http://foo.com/foo" download="bar">click to download</a>

在Chrome中出现问题 - 没有发送referer。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接