如何隐藏来源页地址?referer-policy 对比讲解
发布于 作者:苏南大叔 来源:程序如此灵动~大家都知道,正常情况下来说,这个referer
是浏览器自动发送的,除了系统杀毒软件可以拦截referer
之外。正常的用户,都不能修改referer
来源页信息。但是在某些特殊的情况下,确实需要隐藏referer
,那么是否有简洁容易的隐藏来源页地址的方案?请带着您的疑问,走进苏南大叔的本篇文章。
真假referer
referer
就是指来源页面。在编程的世界里面,它还有另外一种拼写方式,就是:referrer
。两者的差别就是一个r
字母。那么谁对谁错呢?目前来看,两者都对。因为单词拼写上来说,referrer
是正确的拼写方式。但是referer
已经广泛使用于各种编程语言当中,是事实上的标准。所以,两者都不能说有错。
referer
这个错误的拼写方式,首次出现于1990年代的HTTP1.0
协议中。当发现这个拼写错误的时候,这种写法已经被四处普及。所以在后来的HTTP1.1
协议中,存在如下描述。
The Referer[sic] request-header field allows the client to specify, for the server's benefit, the address (URI) of the resource from which the Request-URI was obtained (the "referrer", although the header field is misspelled.)
目前,大多数情况下,都是使用的referer
。只有在宿主环境为浏览器的语言中,还在坚持正确的拼写法方式referrer
。所以,大家除了写客户端js
或者html
的时候,需要注意一下,就好了。
控制referer
一般可以在html
页面的meta
区域,添加如下类似代码。
<meta name="referrer" content="never" />
其中的content
字段内容,会有较大的变化。那么常见的取值如下,下列图表中,左侧是经典取值。右侧是最新的标准。两者任选一种方式即可。
never | no-referrer |
default | no-referrer-when-downgrade |
always | unsafe-url |
origin-when-crossorigin | origin-when-cross-origin |
方案一:整体隐藏referer
那么对于本文的初始目的,隐藏referer
来说,这个可能的备选方案就是下面的两个了。
<meta name="referrer" content="never" />
<meta name="referrer" content="no-referrer" />
在添加了上述meta
的页面中,点击(跳转)任何页面,下一级页面都不会收到referer
。
方案二:通过服务器端发送特定header,隐藏referer
这个方案中,苏南大叔就不设置meta
了。直接用php
做例子,发出类似信息。
header("Referrer-Policy: no-referrer");
方案二:特定元素隐藏referer
这个方案其实很不常见,但是真实有效。那就是针对特殊的dom
元素,设置是否传递referer
。
a
和link
标签可以通过属性rel
指定noreferrer
,仅对当前链接有效。注意写法:noreferrer
,不是no-referrer
。a
、area
、link
、iframe
和img
还可以通过referrerPolicy
进行设置。写法就是referrerPolicy="never"
或者referrerPolicy="no-referrer"
。注意,这里的policy
的P
是大写的。这个是标准写法!否则特殊情况下,不会生效的。
这里有个很邪恶的作用,苏南大叔就不明说了。大家试试吧。
方案对比代码
下面是两个测试文件,苏南大叔页不详细解释了。一切都在代码中,大家自己看。index.php
:
<?php
//header("Referrer-Policy: no-referrer");
?>
<html>
<head>
<meta charset="UTF-8">
<!--
<meta name="referrer" content="never" />
<meta name="referrer" content="no-referrer" />
-->
</head>
<body>
<a href="check.php">检测是否有referer1</a><br/>
<a href="check.php" rel="noreferrer">检测是否有referer2</a><br/>
<a href="check.php" referrer="no-referrer">检测是否有referer3</a><br/>
<iframe src="check.php"></iframe><br/>
<iframe referrerPolicy="no-referrer" src="check.php"></iframe><br/>
<img src="img.php?1" width="200">
<img src="img.php?2" referrerPolicy="no-referrer" width="200"><br/>
</body>
</html>
check.php
:
<?php
header("Content-type: text/html; charset=utf-8");
echo "来源页是:".@$_SERVER["HTTP_REFERER"];
?>
img.php
:
<?php
$from = @$_SERVER["HTTP_REFERER"];
if($from==""){
$img="null.png";
}
else{
$img="ok.png";
}
header("content-type:image/png");
echo file_get_contents($img);
?>
上述index.php
的排列组合很多,苏南大叔就不一一试验了。大家自己试试。
总结
很简单的代码,但是效果却非常地显著。可以完全刷新大家对referer
的认识。
更多referer
的相关文章,请点击下面的链接查看。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。