referer:服务器伪造

HTTP协议头部REFERER用法及伪造

1、Refere定义

Referer是HTTP请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含Referer 。比如我在www.xxxx.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=https://www.xxxx.com信息

2、Refere作用

1.防盗链

那么可以利用这个来防止盗链了,比如我只允许我自己的网站访问我自己的图片服务器,那我的域名是www.xxx.com,那么图片服务器每次取到Referer来判断一下是不是我自己的域名www.xxxx.com,如果是就继续访问,不是就拦截。

2.防止恶意请求。

比如我的网站上,静态请求是.html结尾的,动态请求是.shtml,那么由此可以这么用,所有的*.shtml请求,必须 Referer 为我自己的网站。

3.空Referer是怎么回事?什么情况下会出现Referer?

首先,我们对空 Referer 的定义为, Referer 头部的内容为空,或者,一个 HTTP 请求中根本不包含 Referer 头部。

那么什么时候 HTTP 请求会不包含 Referer 字段呢?根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。

比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含 Referer 字段的,因为这是一个“凭空产生”的 HTTP 请求,并不是从一个地方链接过去的。

4.那么在防盗链设置中,允许空Referer和不允许空Referer有什么区别?

允许 Referer 为空,意味着你允许比如浏览器直接访问,就是空。

3、Refere可靠吗?

Refere不可靠,但有部分作用,起码增加了爬图难度和成本,因为在浏览器端你是无法指定(伪造),你只能通过定义meta元素告诉浏览器怎么用

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

content有如下值:

如果 referer-policy 的值为 never:删除 http head 中的 referer;

如果 referer-policy 的值为 default:如果当前页面使用的是 https 协议,而正要加载资源使用的是普通的 http 协议,则将 http header 中额 referer 置为空;

如果 referer-policy 的值 origin:只发送 origin 部分;

如果 referer-policy 的值为 always:不改变 http header 中的 referer 的值;

4、Refere伪造

只能在服务器端指定,Refere参数位置在$_SERVER['HTTP_REFERER']

4.1、CURL方法

function curl_post($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, 'http://www.baidu.com'); $output = curl_exec($ch); curl_close($ch); return $output; }

4.2、file_get_contents方法

$opts = array( 'http'=>array( 'method'=>"GET", 'header'=>"Referer: http://www.baidu.com" ) ); $context = stream_context_create($opts); var_dump(file_get_contents('http://www.c.com/api.php', false, $context));