转自:https://blog.csdn.net/u011250882/article/details/49679535

引言

在php中,可以使用$_SERVER[‘HTTP_REFERER’]来获取HTTP_REFERER信息,关于HTTP_REFERER,php文档中的描述如下:

“引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 
HTTP_REFERER 的功能。简言之,该值并不可信。 ”

在百度百科中,对于该参数的描述如下:

“HTTP 
Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。”

从上面的论述中我们可以得到如下几点结论:

  1. http_referer由浏览器生成,并不是所有浏览器都会设置该值。
  2. http_referer可以伪造,并不可信。

HTTP_REFERER的用途

HTTP_REFERER提供了引导用户代理到当前页的前一页的地址信息,常见的一些应用场景有防盗链,统计文章有多少次是来自谷歌搜索结果,多少次来自百度搜索结果等。 
下面以防盗链为例,讲讲HTTP_REFERER的用法。 
如果你经常写博客,就一定会遇到盗用你辛辛苦苦整理过的文章不跟你打任何招呼甚至连原文链接都一并抹除的网站,文字这个层面我们没法控制,但是图片这个层面我们是可以控制的。举个例子,如果你也曾复制过一些类似腾讯等网站的文章,你会发现黏贴下来发表之后经常出现图片无法显示,这是如何做到的呢? 
场景:a站点的图片全部存储在c站点(云服务器)上,c站点将识别调用方是否来自a站点,否则显示一张错误图片,b站是盗图网站。 
a站和b站的代码一致,如下所示:

<img src="http://www.c.com/image.php?fname=jb.png" width="500px" height="500px" />;
  • 1

重点是c站的代码,如下所示:

<?php
if(strpos($_SERVER['HTTP_REFERER'], 'www.a.com')  !== false){//以下的写法并不严谨,这里只是做测试if(file_exists($_GET['fname'])){echo file_get_contents($_GET['fname']);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样当a站访问时图片可以正常显示,而b站访问时图片是显示不出来的。

什么时候获取不到HTTP_REFERER值

综上所述,HTTP_REFERER存在需要两个条件:

  • 浏览器(客户端)请求(服务器端请求的情况下,是不存在HTTP_REFERER的,但是可以伪造header,这在下一节中将提及);
  • 存在前导页;

    以下是网友收集的获取不到HTTP_REFERER值的情况:

  • 在浏览器内直接敲URL

  • windows桌面上的超链接图标
  • 浏览器内书签
  • 第三方软件(如Word,Excel等)内容中的链接
  • SSL认证网站跳入
  • http://example.com/“> meta页面设置自动跳转时,在example.com将取不到REFERER URL
  • 使用JavaScript的Location.href或者是Location.replace()

在以下情况下可以获取HTTP_REFERER值:

  • 直接用
  • form提交的表单(POST或GET)
  • src请求(如js的script标签及html中img标签的src属性)

如何伪造HTTP_REFERER

前面提到HTTP_REFERER是可以伪造的,那么在php中,如何伪造HTTP_REFERER呢?有如下三种方法: 
首先是接口代码:

<?php
$HTTP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
exit(json_encode(array('status' => 'ok','refer' => $HTTP_REFERER )
));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • curl 
    代码示例:
<?phpfunction curl_post($url){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); $output = curl_exec($ch);curl_close($ch);return $output;
}var_dump(curl_post("http://www.c.com/api.php"));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行结果如下: 
 
伪造成功。

  • file_get_contents

    一直没怎么用过file_get_contents来发送post请求,其实file_get_contents可以发送任何http请求,后期会针对性的整理一篇文章出来。

代码示例:

$opts = array('http'=>array('method'=>"GET",'header'=>"Referer: http://www.google.com")
);$context = stream_context_create($opts);// Open the file using the HTTP headers set above
var_dump(file_get_contents('http://www.c.com/api.php', false, $context));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

执行结果: 
 
伪造成功

  • socket 
    代码示例:
$fp = fsockopen("www.c.com", 80, $errno, $errstr, 30);
if (!$fp) {echo "$errstr ($errno)<br />\n";
} else {$out = "GET /api.php HTTP/1.1\r\n";$out .= "Host: www.c.com\r\n";$out .= "Referer: www.google.com\r\n";$out .= "Connection: Close\r\n\r\n";fwrite($fp, $out);while (!feof($fp)) {echo fgets($fp, 128);}fclose($fp);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行结果: 

伪造成功。

在做这次测试的时候,第一次执行报错:Your browser sent a request that this server could not understand. 
后来发现是$out = “GET api.php HTTP/1.1\r\n”;中少了’/’,纠结了老半天,晕死

HTTP_REFERER的用法及伪造相关推荐

  1. HTTP_REFERER的用法及伪造及去掉REFERER方法

    HTTP_REFERER的用途 HTTP_REFERER提供了引导用户代理到当前页的前一页的地址信息,常见的一些应用场景有防盗链,统计文章有多少次是来自谷歌搜索结果,多少次来自百度搜索结果等.  下面 ...

  2. php使用referer,php中HTTP_REFERER函数用法实例

    本文实例分析了php中HTTP_REFERER函数用法.分享给大家供大家参考.具体分析如下: 利用php的http_referer函数来判断用户的来路,这是比较简单的,实例代码如下: if (isse ...

  3. 篡改referer_HTTP_REFERER的用法及伪造

    引言 在php中,可以使用$_SERVER['HTTP_REFERER']来获取HTTP_REFERER信息,关于HTTP_REFERER,php文档中的描述如下: "引导用户代理到当前页的 ...

  4. php httpreferer,php中HTTP_REFERER函数用法实例

    这篇文章主要介绍了php中HTTP_REFERER函数用法,以实例的形式分别讲述了判断用户来路与伪造来路地址等应用,需要的朋友可以参考下 本文实例分析了php中HTTP_REFERER函数用法.分享给 ...

  5. 篡改referer_HTTP协议头部REFERER用法及伪造

    1>Refere定义 Referer是HTTP请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含Referer .比如我在www.xxxx. ...

  6. php simplexml_load_file 详解,php中simplexml_load_file函数用法实例讲解

    php中simplexml_load_file函数用法实例讲解 发布于 2015-02-07 06:53:40 | 136 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文 ...

  7. .htaccess的重写规则

    .htaccess基本语法和应用 .htaccess是Apache服务器的一个非常强大的分布式配置文件. 正确的理解和使用.htaccess文件,可以帮助我们优化自己的服务器或者虚拟主机. 如何启用h ...

  8. 再深入 HTTP Referer【转】

    简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理. 比如从 ...

  9. referer与referrer

    Referer的正确英语拼法是referrer.由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了.其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一. 简而言之,HTTP ...

  10. rewrite常用的.htaccess规则举例(rewrite伪静态规则大全)

    先解析一下典型的.htaccess文件: # 开启URL重写 RewriteEngine on # URL重写的作用域 RewriteBase /path/url # 满足怎样的条件 RewriteC ...

最新文章

  1. one-hot encoding不是万能的,这些分类变量编码方法你值得拥有
  2. 推荐策略产品经理:剖析协同过滤(千人千面推荐的核心 )
  3. android 输入法文本选择功能,Android的文本和输入---创建输入法(一)
  4. 网站后台中对html标签的处理
  5. 链表怎么输出最后一个元素无空格_剑指offer系列----从尾到头打印链表
  6. springboot项目集成Flowable资料汇总
  7. 菜单控件menuStrip 1127
  8. 如果你产品的卖点跟竞争对手一样,那你怎么脱颖而出?
  9. python编程符号大全_2020 年最值得学习的 5 大 AI 编程语言
  10. 导航一体机端口测试软件,导航端口查看器
  11. HealthKit详解
  12. 华硕路由器远程连接配置指南
  13. 移动硬盘数据错误循环冗余检查,要怎么恢复资料
  14. C# MVC 微信支付教程系列之公众号支付
  15. 学习笔记(5)品牌查询实现
  16. InnoDB执行delete时到底做了什么?
  17. TypeScript Mixins 混入
  18. 安装Microsoft.UI.Xaml.2.6(WSA安卓子系统安装缺失)
  19. tomcat原理简要分析,java
  20. 【开发教程3】开源蓝牙心率防水运动手环-开发环境搭建

热门文章

  1. 怎样用java抽签小程序,可以作弊的抽签小程序,急求java抽签小程序
  2. javaWeb图书购物商城
  3. 【精】18款在线网页SVG编辑器
  4. svn 管理 mysql_svn web页面管理svnadmin部署
  5. 训练集、验证集和测试集的比较
  6. KETTLE 下载网址
  7. 看拉扎维《模拟CMOS集成电路设计》的一些总结和思考(一)——绪论
  8. 杨辉三角 java版
  9. net: 熟悉传统的交换机芯片
  10. 系统项目验收测试报告怎么做?2020最新测试报告模板