收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 20125|回复: 7

[网络] 如何破解对方网站的图片防盗链

[复制链接]
发表于 2009-6-26 22:02:46 | 显示全部楼层 |阅读模式
阿权今天要说的问题是:
用户粘贴的图片是对方防盗链处理的图片,别人就无法看到图片了,体验很不好。

有问题就有解决办法,但需要预热一下:
1 别人是如何做图片防盗链的?
2 如何可以避免在防盗链范围?

了解或者解决以上两个问题你就可以出师了啦!

众所周知,图片防盗链是为了让自己的服务器提供给固定的某些域名下的网页显示自己的图片,主要为了解决带宽的占用问题。
阿权之前管理的图片类型的网站,居然可以让盗链的图片流量跑满了服务器带宽,所以盗链的问题很讨厌,一般网站都会处理此问题,一般采取的是检查图片请求的referer参数,这个不明白那这个课题还不适合你来读。

我们来看看凤凰网的图片防盗链,图片是很hot的美女哦,curl就可以测试:

  1. [root@aslibra ~]# curl -I http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg
  2. HTTP/1.1 200 OK
  3. Server: DnionOS/1.0
  4. Date: Fri, 26 Jun 2009 13:14:31 GMT
  5. Content-Type: image/jpeg
  6. Connection: keep-alive
  7. Last-Modified: Wed, 10 Jun 2009 11:16:05 GMT
  8. Accept-Ranges: bytes
  9. Content-Length: 37727
  10. Expires: Wed, 23 Jun 2010 08:11:48 GMT
  11. Cache-Control: max-age=31536000
  12. X-Cache: HIT from cache26.ifeng.com
  13. Age: 24507
  14. X-Cache: HIT from CNC-BJBY-53-172.fastcdn.com

  15. [root@aslibra ~]# curl -I http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg -H "referer:http://www.aslibra.com/"
  16. HTTP/1.1 403 Forbidden
  17. Server: DnionOS/1.0
  18. Date: Fri, 26 Jun 2009 13:14:57 GMT
  19. Content-Type: text/html
  20. Connection: keep-alive
  21. Content-Length: 1204
  22. Expires: Fri, 26 Jun 2009 13:15:02 GMT
  23. X-Squid-Error: ERR_ACCESS_DENIED 0
  24. X-Cache: MISS from CNC-BJBY-53-172.fastcdn.com

  25. [root@aslibra ~]# curl -I http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg -H "referer:http://img.ifeng.com/"
  26. HTTP/1.1 200 OK
  27. Server: DnionOS/1.0
  28. Date: Fri, 26 Jun 2009 13:17:37 GMT
  29. Content-Type: image/jpeg
  30. Connection: keep-alive
  31. Last-Modified: Wed, 10 Jun 2009 11:16:05 GMT
  32. Accept-Ranges: bytes
  33. Content-Length: 37727
  34. Expires: Wed, 23 Jun 2010 08:11:48 GMT
  35. Cache-Control: max-age=31536000
  36. X-Cache: HIT from cache26.ifeng.com
  37. Age: 24691
  38. X-Cache: HIT from CNC-BJBY-53-172.fastcdn.com
复制代码


第一个是没有来源标识的,一般为在窗口直接输入图片地址
第二个是模拟在网页里面的图片,网址假设为http://www.aslibra.com/
第三个是模拟在img.ifeng.com的网页打开的

第一个和第三个返回是200的状态码,图片正常,第二个则因为是非授权网页引用,返回了403禁止的消息。
也有可能是返回200的状态码的,比如百度hi的图片:

  1. [root@aslibra ~]# curl -I http://hiphotos.baidu.com/yuanyingmanhua/pic/item/6e1da9d832163a3b33fa1c2b.jpg
  2. HTTP/1.1 200 OK
  3. ...
  4. Cache-Control: max-age=315360000
  5. Expires: Sun, 08 May 2016 14:12:03 GMT
  6. Last-Modified: Sat, 29 Apr 2006 07:04:00 GMT
  7. Content-Length: 43171
  8. ...

  9. [root@aslibra ~]# curl -I http://hiphotos.baidu.com/yuanyingmanhua/pic/item/6e1da9d832163a3b33fa1c2b.jpg -H "referer:http://www.aslibra.com/"
  10. HTTP/1.1 200 OK
  11. ...
  12. Cache-Control: no-cache
  13. Content-Length: 1809
  14. ...
复制代码


当然,如果对方服务器是验证用户的信息的,那就没法解决了,我们能够解决的防盗链一般是根据来源防盗链的服务器。
注意了,破解对方的防盗链并非坏事,是为了提高用户体验,解决一般的用户的疑惑,他们根本不知道粘贴的图片为什么不正常,这你没必要跟他们聊一下图片防盗链吧?

你也许只要付出一台服务器就可以解决了:
1 首先你得把防盗链的域名的图片地址给替换为你的服务器域名,因为正常的访问你是控制不了referer信息的
2 交给代理服务器去掉或者修改referer信息,这个nginx很简便解决
3 再交给缓存服务器下载此图片,缓存此图片,这样对对方服务器没有什么影响,是好事来的

步骤1:替换图片地址

第一个就不用多说了,比如php就可以处理:

  1. //example php code
  2. $content = ereg_replace("http://($domain)/", "http://proxy.www.aslibra.com/m/\\1/", $content);
  3. // from http://img.ifeng.com/res/200906/0610-070615_1339_20.jpg
  4. // to http://proxy.www.aslibra.com/m/img.ifeng.com/res/200906/0610-070615_1339_20.jpg
复制代码


这样的简单处理可以保留所有的图片地址信息,而且可以自动还原原来的请求地址

步骤2 去掉或更改referer信息

这个有很多方法,比如配置proxy.www.aslibra.com/m交给php处理,php容易分析出地址,并且可以用socket或者调用curl等系统命令来下载图片,然后返回给用户。
这里用web服务器(nginx)解决这个问题,肯定比php来的简便和高效:

  1. upstream squid {
  2.   server 127.0.0.1:3128;
  3. }
  4. server {
  5.   expires       240h;
  6.   server_name  proxy.www.aslibra.com;
  7.   if ( $uri ~ ^/m/([^/]+)(.+)) {
  8.     set $new_host $1;
  9.     set $referer "";
  10.     #set $referer http://$1/; #you can set it like this
  11.     rewrite ^/m/([^/]+)(.+) $2 break;
  12.   }
  13.   location / {
  14.     proxy_set_header host $new_host;
  15.     proxy_set_header referer  $referer;
  16.     proxy_pass        http://squid;
  17.   }
  18. }
复制代码


简单来说就是rewrite回原先的地址,并且设置referer,交给squid的后端。

步骤3 交给代理服务器缓存

  1. visible_hostname cache.aslibra.com
  2. acl all src 0.0.0.0/0.0.0.0
  3. http_access allow all
  4. http_port 127.0.0.1:3128
  5. httpd_accel_host virtual
  6. httpd_accel_port 80
  7. httpd_accel_uses_host_header on
  8. httpd_accel_with_proxy off
  9. cache_dir ufs /cache/proxy.www.aslibra.com 2000 16 256
  10. cache_effective_user daemon
  11. cache_access_log none
  12. cache_store_log none
  13. cache_log none
复制代码


以上是squid的配置(2.5版本),基本不用配置什么参数,能代理缓存即可,有别的合适软件也许也可以做,但squid做这个实在是太合适了!你的不二之选!

实验效果很正常,返回的信息如下,访问两次有HIT说明就正常了:

  1. (Status-Line)  HTTP/1.1 200 OK
  2. Cache-Control  max-age=864000
  3. Connection  keep-alive
  4. Content-Length  59969
  5. Content-Type  image/jpeg
  6. Date  Fri, 26 Jun 2009 13:42:32 GMT
  7. Expires  Mon, 06 Jul 2009 13:42:32 GMT
  8. Last-Modified  Mon, 18 Dec 2006 07:25:14 GMT
  9. Server  nginx/0.7.59
  10. X-Cache  HIT from cache.aslibra.com
复制代码




效果对比,前面会提示禁止引用,后面是解决后正常显示图片的效果!
很神奇吧~~ 这样就为用户体验提高了一个等级啦~
注意,以上方案域名为测试指定,访问并非正常,请自行修改相关内容进行试验,大家使用愉快!

本方案更新请关注:
http://www.aslibra.com/blog/post/crack_pic_referer_solution.php

本解决方案目前无法解决的类型:

1 不是判断referer信息来防盗链的,当然如果你知道,也许可以类似方式解决
2 不能解决redirect后的图片,也许可以使用nginx的内部redirect来处理,还没试验,这类情况还不多

评分

参与人数 1威望 +1 收起 理由
birder + 1 做为技术可以+3分,但是做站长的都怕被盗链, ...

查看全部评分

 楼主| 发表于 2009-6-29 23:53:42 | 显示全部楼层
这个嘛。。。只是为了自己架设缓存解决用户提交的内容而造成用户体验不好
并非提倡直链,单讨论技术问题没有什么避讳可言,需要的是解决问题和避免问题,好像大家都会探讨系统的漏洞一样,需要大家关注一些值得关心的问题

不过这里讨论系统架构方面的话题比较少有人感兴趣就是了,来这边发帖也许只是个习惯
回复 支持 反对

使用道具 举报

发表于 2009-7-3 09:45:48 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

发表于 2009-7-4 04:16:45 | 显示全部楼层

太好了

支持一下,
回复 支持 反对

使用道具 举报

发表于 2009-7-6 09:52:00 | 显示全部楼层
原帖由 [i]hqlulu 于 2009-6-26 22:02 发表
阿权今天要说的问题是:
图片是很hot的美女哦...
...

贡献了一个IP~

向楼主学习发贴要诀...
回复 支持 反对

使用道具 举报

发表于 2009-7-7 18:08:27 | 显示全部楼层
我觉得这个帖子不错。顺便咨询一下,论坛里有没有讨论视频设计的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 20:32:54 | 显示全部楼层
原帖由 [i]fkueaps 于 2009-7-6 09:52 发表

贡献了一个IP~

向楼主学习发贴要诀...


我又不是标题党,要学就学习发点好东西就行了
回复 支持 反对

使用道具 举报

发表于 2009-7-9 00:35:51 | 显示全部楼层
支持。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-7-3 03:20 , Processed in 0.171440 second(s), 14 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表