欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-03-20 13:28:56
...
  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重写。有的方法能的确达到不错的效果。