当前位置:  编程技术>php

php伪造referer 使用referer防止图片盗链

    来源: 互联网  发布时间:2014-10-08

    本文导语:  什么是http referer http referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务...

什么是http referer

http referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从http referer中统计出每天有多少用户点击我主页上的链接访问他的网站。因此可以使用php伪造referer。

referer其实应该是英文单词referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。

问题描述:
刚把feed阅读器改变为gregarius,但他不像我以前用的liferea,访问新浪博客时,无法显示其中的图片,提示“此图片仅限于新浪博客用户交流与沟通”,我知道,这就是http referer导致的。
由于我上网客户端配置的特殊性,首先怀疑是squid的问题,但通过实验排除了,不过同时发现了一个squid和tor、privoxy协同使用的隐私泄露问题,留待以后研究。
gregarius能处理这个问题么?
答案是否定的,因为gregarius只是负责输出html代码,而对图像的访问是有客户端浏览器向服务器请求的。
不过,安装个firefox扩展也许能解决问题,文中推荐的”send referrer”我没有找到,但发现另外一个可用的:”refcontrol“,可以根据访问网站的不同,控制使用不同的referer。
但是我不喜欢用firefox扩展来解决问题,因为我觉得他效率太低,所以我用更好的方式——privoxy。
privoxy真棒
在privoxy的default.action中添加两行:
{+hide-referrer{forge}}
.album.sina.com.cn
这样gregarius中新浪博客的图片就出来了吧?+hide-referrer是privoxy的一个过滤器,设置访问时对http referer的处理方式,后面的forge代表用访问地址当作refere的,还可以换成block,代表取消referer,或者直接把需要用的referer网址写在这里。

用privoxy比用firefox简单的多,赶紧换吧。
from https to http
从一个https页面上的链接访问到一个非加密的http页面时,在http页面上是检查不到http referer的,比如当我点击自己的https页面下面的w3c xhtml验证图标(网址为http://validator.w3.org/check?uri=referer),从来都无法完成校验,提示:
no referer header found!
原来,在http协议的rfc文档中有定义:
15.1.3 encoding sensitive information in uri's
clients should not include a referer header field in a (non-secure)
http request if the referring page was transferred with a secure
protocol.
这样是出于安全的考虑,访问非加密页时,如果来源是加密页,客户端不发送referer,ie一直都是这样实现的,firefox浏览器也不例外。但这并不影响从加密页到加密页的访问。
firefox中关于referer的设置
都在里,有两个键值:
network.http.sendrefererheader (default=2) 设置referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么时不发送,2为始终发送。参见privacy tip #3: block referer headers in firefox
network.http.sendsecurexsitereferrer (default=true) 设置从一个加密页访问到另外一个加密页时是否发送referer,true为发送,false为不发送。

利用referer防止图片盗链

虽然referer并不可靠,但用来防止图片盗链还是足够的,毕竟不是每个人都会修改客户端的配置。实现一般都是通过apache的配置文件,首先设置允许访问的地址,标记下来:
 

代码示例:
# 只允许来自don.com的访问,图片可能就放置在don.com网站的页面上
setenvifnocase referer "^http://www.don.com/" local_ref
# 直接通过地址访问
setenvif referer "^$" local_ref
 

然后,再规定被标记了的访问才被允许:
 

代码示例:

order allow,deny
allow from env=local_ref

或者

   order deny,allow
   deny from all
   allow from env=local_ref

不要使用rerferer的地方

不要把rerferer用在身份验证或者其他非常重要的检查上,因为rerferer非常容易在客户端被改变,不管是通过上面介绍的firefox扩展,或者是privoxy,甚至是libcurl的调用,所以rerferer数据非常之不可信。
如果你想限制用户必须从某个入口页面访问的话,与其使用referer,不如使用session,在入口页面写入session,然后在其他页面检查,如果用户没有访问过入口页面,那么对应的session就不存在,参见这里的讨论。不过和上面说的一样,也不要过于相信这种方式的“验证”结果。
个人感觉现在rerferer除了用在防盗链,其他用途最多的就是访问统计,比如统计用户都是从哪里的链接访问过来的等等。

http-referer这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。
以下是伪造方法:
php(前提是装了curl):
 

代码示例:
$ch = curl_init();
curl_setopt ($ch, curlopt_url, "http://www.d.cn/xxx.asp");
curl_setopt ($ch, curlopt_referer, "http://www.d.cn/");
curl_exec ($ch);
curl_close ($ch);

php(不装curl用sock)
 

代码示例:
$server = 'www.dc9.cn';
$host = 'www.dc9.cn';
$target = '/xxx.asp';
$referer = 'http://www.d.cn/'; // referer
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr ($errno)
n";
}
else
{
$out = "get $target http/1.1rn";
$out .= "host: $hostrn";
$out .= "cookie: aspsessionidsqtbqsda=dfcapklbbficdafmhnkigkegrn";
$out .= "referer: $refererrn";
$out .= "connection: closernrn";
fwrite($fp, $out);
while (!feof($fp))
{
echo fgets($fp, 128);
}
fclose($fp);
}
javascript
xmlhttp.setrequestheader("referer", "http://url");//   呵呵~假的~
 

js不支持^_^

原理都是sock构造http头来senddata。其他语言什么的比如perl也可以,目前比较简单的防御伪造referer的方法是用验证码(session)。
现在有一些能防盗链软件的商业公司比如uudog,linkgate,virtualwall什么的,都是开发的应用于iis上面的dll。
有的是采用cookies验证、线程控制,有的是能随机生成文件名然后做url重写。有的方法能的确达到不错的效果。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • php防止sql注入代码实例
  • PHP防止表单重复提交的几种常用方法汇总
  • php实现cc攻击防御和防止快速刷新页面示例
  • php防止页面后退的方法
  • PHP如何防止post重复提交数据 实例代码
  • php文件下载(防止中文文件名乱码)的示例代码
  • PHP连接MySQL的2种方法小结以及防止乱码
  • PHP防止post重复提交数据的简单例子
  • php防止sql注入的代码示例
  • PHP登录环节防止sql注入的方法浅析
  • php防止刷流量攻击实现代码
  • php防止sql注入函数用法
  • php防止sql注入函数(discuz)
  • php防止刷新与重复提交实例代码
  • php防止sql注入实例解析
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • php输入流php://input使用示例(php发送图片流到服务器)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP转换器 HipHop for PHP
  • PHP去除html标签,php标记及css样式代码参考
  • PHP 框架 Pop php
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • PHP的JavaScript框架 PHP.JS
  • php通过socket_bind()设置IP地址代码示例
  • php服务器探针显示php服务器信息
  • php安装完成后如何添加mysql扩展
  • PHP缓存加速器 Alternative PHP Cache (APC)
  • PHP的substr() 函数用法
  • PHP源文件加密工具 PHP Screw


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3