本文导航 > Referer是什么 > Referer何时有值 > Referer的应用 > https网页引用Referer防盗链的资源返回403的原因及解决办法 > 伪造Referer > 参考资料


Referer是什么

Referer是HTTP协议的header标头的一部分。

其实Referer是错误的拼写,正确的是Referrer。不过,现在在翻译网站输入referer,它多半会告诉你这是引用页的意思。向将错就错势力低头!
p.s.在JavaScript中,referer还是拼作referrer,↓

1
document.write(document.referrer);

Referrer的原意是介绍人,所以显而易见,referer头域的值表明了是哪个URL地址触发了对当前页面的访问。

在现代浏览器(如Chrome)中,可以利用开发者工具查看当前使用的Referer策略与Referer的值。

在Network中Headers的General栏中的Referrer Policy的值即是当前使用的Referer策略。关于这个策略的更详细的内容请参阅 Referrer Policy

Referer Policy

在Network中Headers的Request Header栏中的Referer就是本文的主角。

Referer Policy

如果你查看的时候Request Header中显示Provisional headers are shown ,是因为浏览器直接从缓存中读入了,这时只需Ctrl+F5刷新网页即可查看完整header信息。


Referer何时有值

以下情形中Referer有值:
①从某网页点击链接访问另一网页
②form提交的表单(POST或GET)
③src请求(如js的script标签及html中img标签的src属性)

以下情形中Referer无值:
①在浏览器内直接敲URL访问网页
②windows桌面上的超链接图标
③浏览器内书签
④第三方软件(如Word,Excel,outlook等)内容中的链接
⑤有类似于<meta http-equiv="refresh" content="5; url=http://example.com/"> 的页面在自动跳转时,在example.com将取不到REFERER URL
⑥使用JavaScript的Location.href或者是Location.replace()
⑦使用html5中的noreferrer<a href="/index.php?noreferer" rel="noreferrer" target="_blank">noreferrer</a>
⑧https网站→http网站


Referer的应用

①资源防盗链
②判断用户通过哪个搜索引擎、哪个关键词进入站点
③判断用户流入源以展示定制的欢迎信息(如:欢迎来自xx.com的朋友)
……


https网页引用Referer防盗链的资源返回403的原因及解决办法

出于安全考虑,避免安全性无法得到保障的http网站获得重要的信息,浏览器的默认Referer策略为no-referrer-when-downgrade,这意味着当https网页转到http网页或引用http资源时,浏览器的请求头中将不会带上Referer。
这是个特例,https→https、http→https以及http→http都会带上Referer。
因此,如果你的资源不允许空Referer访问/引用,那么肯定会收到403错误。
基于此思路,
方案一:只需要将Referer防盗链规则改为”允许空Referer”即可。
方案二:将资源站升级为https站点。


伪造Referer

利用浏览器插件伪造Referer→Referer Control

以下是使用PHP生成伪造的header信息请求资源的方法
所谓道高一尺魔高一丈,从来没有绝对的壁障。既然你通过判断Referer来防盗链,那么我伪造不就好了。
Referer毕竟基于客户端,全凭浏览器的自觉,如果利用专门的浏览器插件或者干脆生成一个完整header信息拿去请求资源,光靠Referer防盗链是防不住的。
在贴代码前我推荐各位担心自己的资源被盗用的朋友试试时间戳防盗链回源鉴权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function cheat($url){
$headers = array();
//以下是设置其他的header信息,当然也可以只设置Referer的值
$headers[] = 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';
$headers[] = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$headers[] = 'Accept-Encoding: gzip, deflate';
$headers[] = 'Accept-Language: zh-CN,en;q=0.5';
$headers[] = 'Cache-Control: no-cache';
//以上是设置其他的header信息,当然也可以只设置Referer的值
$headers[] = 'Referer: https://shangyes.net'; //设置Referer
$ch = curl_init ();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_exec($ch);
curl_close ($ch);
}
cheat("https://shangyes.net");

应用的思路是:
将Referer的值改为防盗链白名单中的域名,当在自己的网页上引用资源时,将资源的url传递给上面的函数,该函数会直接输出资源的内容。

p.s.当然,资源是图片时别忘了给个header(‘Content-type: image/jpg’);
完整的盗链文件不贴出,防止伸手党哈哈。


参考资料

[Referer头域的表现]
[HTTP_REFERER的用法及伪造]
[Referer何时有值何时无值]

知识共享申明

知识共享许可协议本作品采用知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可。