使用Referer Header

信息安全 Web应用程序 网页浏览器 php javascript
2021-09-07 17:30:36

有2个站点:

http://www.site1.com
http://www.site2.com

http://www.site1.com包含指向http://www.site2.comas 的链接

<a href="http://www.site2.com/">link<a/>

当用户从浏览器单击链接时,http://www.site1.com会将 Referer 标头发送到http://www.site2.com. 基于 Referrer 标头http://www.site2.com进行一些处理。

我想知道我是否可以伪造/更改(可能使用 javascript、PHP、...)Referer 标头或根本不发送它?

4个回答

两种情况需要控制Referer标题。顺便说一句,Referer是“推荐人”这个词的拼写错误。

如果您想控制您的个人浏览器不传递Refererto site2.com,您可以使用许多浏览器扩展来做到这一点:

  • 对于 Firefox,有RefControl(我使用并且很满意。我使用选项“Forge-发送站点的根目录”)
  • Chrome 有Referer Control

另一种情况是您是网站管理员,并且您希望您网站(site1.com)用户不要将其发送Referer到您网站上链接的其他网站。您可以通过多种方式做到这一点:

  • 在您的网站上使用 SSL/TLS (https),​​并且浏览器的一项安全功能是不会Referer在您使用 SSL/TLS 提供的页面上传递到 HTTP 链接。但是,如果您页面上的链接使用 HTTPS,那么Referer除非通过下面描述的其他方式明确关闭,否则仍将被传递。
  • 使用 HTML5rel="noreferrer"属性。所有主流浏览器支持
  • 使用数据 URL ('data:') 隐藏链接来自的实际页面:<a href='data:text/html;charset=utf-8, <html><meta http-equiv="refresh" content="0;URL=&#39;http://site2.com/&#39;"></html>'>Link text</a>.
  • Referer通过中间页面重定向来隐藏。这种类型的重定向通常用于防止潜在的恶意链接使用 获取信息Referer,例如查询字符串中的会话 ID。许多大型社区网站在外部链接上使用链接重定向来减少可用于窃取帐户信息的漏洞的机会,并在用户离开服务时明确,以减少有效网络钓鱼的机会。

这是 PHP 中一个简单的重定向示例:

<?php
$url = htmlspecialchars($_GET['url']);
header( 'Refresh: 0; url=http://'.$url );
?>
<html>
 <head>
  <title>Redirecting...</title>
  <meta http-equiv="refresh" content="0;url=http://<?php echo $url; ?>">
 </head>
 <body>
 Attempting to redirect to <a href="http://<?php echo $url; ?>">http://<?php echo $url; ?></a>.
 </body>
</html>

自 2015 年起,您可以通过以下方式阻止您的网站发送 Referer 标头:

只需将其添加到网页的头部:

 <meta name="referrer" content="no-referrer" />

这适用于链接和页面上 JavaScript 代码发出的Ajax 请求。

其他有效meta选项包括:

<meta name="referrer" content="unsafe-url" />
<meta name="referrer" content="origin" />
<meta name="referrer" content="no-referrer-when-downgrade" />
<meta name="referrer" content="origin-when-cross-origin" />

• 在此处查看它是否适用于您的浏览器:http : //caniuse.com/#feat=referrer-policy

• 在此处查看规范:http : //w3c.github.io/webappsec/specs/referrer-policy/

注意:如果您只想使用 JavaScript 来删除引用者,我相信您可以在发出 Ajax 请求之前动态添加适当的元标记。但是,我没有对此进行测试。

另请注意,浏览器现在发送Origin包含域和端口标头,据我所知,无法删除。如果您使用<meta name="referrer" content="origin" />引荐来源网址将包含与Origin标题类似的信息,这从隐私的角度来看已经很好,因为它会隐藏用户所在的确切页面。

除非您控制调用客户端(例如浏览器),否则您无法修改引用标头。

浏览器阻止修改引用者,并且服务器端代码无法将标头注入请求中,因为无法将标头从服务器获取到客户端,并使客户端将其注入下一个请求的引用标头中。

这是假设浏览器没有针对 JavaScript 标头注入的特定漏洞。

推荐问题及其历史的精彩概述可以在“为了乐趣和利润而剥离推荐人”中找到。

同一篇文章还包含以下链接:

  1. referer.us,一个 URL 重定向服务,现在重定向到url.rw,但两者 都不应该被信任,
  2. 一个独立于浏览器的客户端脚本,使用了很棒的<iframe src=about:blank>技巧。