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

原创
2016-07-25 08:54:36 1021浏览
  1. # 只允许来自don.com的访问,图片可能就放置在don.com网站的页面上
  2. setenvifnocase referer "^http://www.don.com/" local_ref
  3. # 直接通过地址访问
  4. setenvif referer "^$" local_ref
复制代码

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

  1. order allow,deny
  2. allow from env=local_ref
  3. 或者
  4. order deny,allow
  5. deny from all
  6. allow from env=local_ref
复制代码

不要使用rerferer的地方

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

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

  1. $ch = curl_init();
  2. curl_setopt ($ch, curlopt_url, "http://www.d.cn/xxx.asp");
  3. curl_setopt ($ch, curlopt_referer, "http://www.d.cn/");
  4. curl_exec ($ch);
  5. curl_close ($ch);
复制代码

php(不装curl用sock)

  1. $server = 'www.dc9.cn';
  2. $host = 'www.dc9.cn';
  3. $target = '/xxx.asp';
  4. $referer = 'http://www.d.cn/'; // referer
  5. $port = 80;
  6. $fp = fsockopen($server, $port, $errno, $errstr, 30);
  7. if (!$fp)
  8. {
  9. echo "$errstr ($errno)
    \n";
  10. }
  11. else
  12. {
  13. $out = "get $target http/1.1\r\n";
  14. $out .= "host: $host\r\n";
  15. $out .= "cookie: aspsessionidsqtbqsda=dfcapklbbficdafmhnkigkeg\r\n";
  16. $out .= "referer: $referer\r\n";
  17. $out .= "connection: close\r\n\r\n";
  18. fwrite($fp, $out);
  19. while (!feof($fp))
  20. {
  21. echo fgets($fp, 128);
  22. }
  23. fclose($fp);
  24. }
  25. javascript
  26. xmlhttp.setrequestheader("referer", "http://url");// 呵呵~假的~
复制代码

js不支持^_^

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



声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。