转自: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. 特斯拉烧,特斯拉烧完蔚来烧
  2. mysql之优化小技巧
  3. Buffer Cache Hit Ratio
  4. Java当中的运算符
  5. ITK:布雷森汉姆线BresenhamLine
  6. 与IO相关的等待事件troubleshooting-系列9
  7. centos svn 的搭建
  8. 了解Spring Web应用程序体系结构:经典方法
  9. chrome 使用gpu 加速_一招解决 Chrome / Edge 卡顿缓慢 让浏览器重回流畅顺滑
  10. 学生成绩查询html,中学生成绩查询用的一个网站叫什么行
  11. FPGA设计之首——Altera FPGA 选型及官网文档阅读
  12. 基于Ionic3和极光推送实现推送功能
  13. 医院绩效考核和奖金分配方案
  14. Exchange邮件服务器渗透
  15. Android Service 定时任务
  16. 移动web之四种常用布局
  17. python和r语言哪个简单_python与r语言哪个简单
  18. 传鸿蒙操作系统掌舵人王成录已从华为离职
  19. 谈谈 Spring 中的 NoSuchBeanDefinitionException
  20. 你的团队健康吗?如何打造一支健康的团队?

热门文章

  1. 8 9区别 endnote7_EndNote_9__简明教程_中文版
  2. 编程验证足球预测算法的准确概率
  3. 软件测试用例优先级,软件测试用例的优先级划分方法
  4. 对中国大学MOOC课程视频批量下载的探索
  5. Linux搭建测试环境详细步骤
  6. word2vec和node2vec笔记(更新ing)
  7. node2vec 图向量
  8. 方案展示 | 基于全志A40i的激光喷码机解决方案
  9. crf的实现 keras_keras 解决加载lstm+crf模型出错的问题
  10. 深入浅出 NXLog (一)