以百度空间为例
图片地址:http://hiphotos.baidu.com/%DF%DE%D1%BD%B0%A52008/pic/item/c137a08384cd63a56d8119fe.jpg
直接引用
破解防盗链引用
以新浪相册为例
图片地址:http://static2.photo.sina.com.cn/middle/5cd4bb4e458bcb617fc11.jpg
直接引用
破解防盗链引用
以网易博客为例
图片地址:http://img.blog.163.com/photo/E7t6QFl7vy7HRIKkV5xgaw==/1983272685904244011.jpg
直接引用
破解防盗链引用
以搜狐博客为例
图片地址:http://1872.img.pp.sohu.com.cn/images/2008/10/8/20/26/11d83ef58cfg214.jpg
直接引用
破解防盗链引用
方法:http://www.hongkongfans.cn/图片地址(去掉http:// 且带上后缀.jpg)
例如图片地址为:http://www.xxx.com/xxx.jpg
那么破解防盗链后的地址为:http://www.hongkongfans.cn/www.xxx.com/xxx.jpg
个人网站转载图片:破解防盗链图片盗链无法显示解决方法
有些相册,比如百度相册、QQ相册、网易相册、新浪相册、搜狐相册等等,都是只能在他们自己的网站显示的,如何让这些图片可以外链了?
用下面这个showpicASP盗链代码,保存为xxx.asp,上传到一个支持ASP的空间,图片地址形式
如:http://ad.qicaispace.com/images.asp?url=xxx(xxx是要盗链的图片地址)
<%
Dim url, body, myCache
url = Request.QueryString("url")
Set myCache = new cache
myCache.name = "picindex"&url
If myCache.valid Then
body = myCache.value
Else
body = GetWebData(url)
myCache.add body,dateadd("d",1,now)
End If
If Err.Number = 0 Then
Response.CharSet = "UTF-8"
Response.ContentType = "application/octet-stream"
Response.BinaryWrite body
Response.Flush
Else
Wscript.Echo Err.Description
End if
'取得数据
Public Function GetWebData(ByVal strUrl)
Dim curlpath
curlpath = Mid(strUrl,1,Instr(8,strUrl,"/"))
Dim Retrieval
Set Retrieval = Server.CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", strUrl, False,"",""
.setRequestHeader "Referer", curlpath
.Send
GetWebData =.ResponseBody
End With
Set Retrieval = Nothing
End Function
/* anti-images:www.tancee.com */
'cache类
class Cache
private obj 'cache内容
private expireTime '过期时间
private expireTimeName '过期时间application名
private cacheName 'cache内容application名
private path 'url
private sub class_initialize()
path=request.servervariables("url")
path=left(path,instrRev(path,"/"))
end sub
private sub class_terminate()
end sub
public property get blEmpty
'是否为空
if isempty(obj) then
blEmpty=true
else
blEmpty=false
end if
end property
public property get valid
'是否可用(过期)
if isempty(obj) or not isDate(expireTime) then
valid=false
elseif CDate(expireTime)<now then
valid=false
else
valid=true
end if
end property
/* anti-images:www.tancee.com */
public property let name(str)
'设置cache名
cacheName=str & path
obj=application(cacheName)
expireTimeName=str & "expires" & path
expireTime=application(expireTimeName)
end property
public property let expires(tm)
'重设置过期时间
expireTime=tm
application.lock
application(expireTimeName)=expireTime
application.unlock
end property
public sub add(var,expire)
'赋值
if isempty(var) or not isDate(expire) then
exit sub
end if
obj=var
expireTime=expire
application.lock
application(cacheName)=obj
application(expireTimeName)=expireTime
application.unlock
end sub
public property get value
'取值
if isempty(obj) or not isDate(expireTime) then
value=null
elseif CDate(expireTime)<now then
value=null
else
value=obj
end if
end property
/* anti-images:www.tancee.com */
public sub makeEmpty()
'释放application
application.lock
application(cacheName)=empty
application(expireTimeName)=empty
application.unlock
obj=empty
expireTime=empty
end sub
public function equal(var2)
'比较
if typename(obj)<>typename(var2) then
equal=false
elseif typename(obj)="Object" then
if obj is var2 then
equal=true
else
equal=false
end if
elseif typename(obj)="Variant()" then
if join(obj,"^")=join(var2,"^") then
equal=true
else
equal=false
end if
else
if obj=var2 then
equal=true
else
equal=false
end if
end if
end function
end class
%>
附:
盗链、防盗链与网站可用性
图片防盗链(也包括其他类型的文件如音频、视频等)机制的目标在于保护自己的服务器资源特别是网络带宽不被非法滥用,合理的防盗链机制能够让网站有效地远离不法网站的侵扰,让网站资源最大限度地为自己的访问用户服务,而不是不知不觉地默默为其他网站作贡献。同时,必须注意的是,任何防盗链机制都不是百分之百“可靠”的,事实上,大多数网站的防盗链设置都是在保护自己不受盗链网站的侵害与保证网站可用性之间寻得一个可以接受的平衡点,而网站自身的可用性则显然应放在第一位,开句玩笑说,最有效的防盗链机制,恐怕是拒绝一切http请求 ,那样,无论其他网站采用怎样的手段,也无法使用您的图片以及带宽,但这也会让自己的网站不可用。
另一方面,防盗链技术自身,从来不是也不可能是网站保护自己版权的手段。简单地说,只要网页面向公众发布,只要网页能够被“看”到,无论采用怎样的“保护”机制,剽窃者总是有办法将您的内容包括网页上的各种元素收为已有的,尤其在一个法律失位道德混乱的国度,“聪明人”总是不断涌现的,各种手段总是层出不穷的。而我们之所以RSS Feed 改为全文输出中做那样的说明,是因为:1、表明我们对抓虾处理Feed的方式“不认同不合作”的立场;2、在检查我们自己的Feed中抓虾中的显示情况时,确实可以看到图片防盗链机制能够起作用,整个页面被一贴贴“膏药”弄得支离破碎,会在很多程度影响用户的阅读体验,提请潜在的订阅用户如果可能的话尽量不要使用抓虾订阅我们的Feed。
抓虾对防盗链的“破解”
我们前面两篇文章中关于抓虾的讨论部分,果然再次验证了我的不学无术与孤陋寡闻 。一位署名“Name”的朋友留言说:
从技术角度来说,你这个根本防不住
看下面的链接
http://www.zhuaxia.com/readpic.php?url=http://blogsdiy.org/wp-includes/images/smilies/icon_redface.gif
抓虾对防盗链的图片,可以通过服务器抓取来显示
检查了一下,果然!我们的防盗链设置对此无能为力。
再次查看我们的Feed在抓虾中的对应页面,如《RSS Feed 改为全文输出》一文在抓虾中对应的“http://www.zhuaxia.com/item/392061212”,可以看出抓虾并没有对我们的图片采用类似的处理,即未在图片文件url前添加诸如“http://www.zhuaxia.com/readpic.php?”的字串,设想中的“补丁”效果仍是存在的。
很显然,抓虾并不是对所有博客feed中的图片文件url都进行类似的转换处理。那么,哪些博客有幸“中选”呢?
在抓虾好看中着实找了半天——至少又为抓虾贡献了半个小时左右的停留时间与数量不小的PageViews,呵呵——不得要领,直到后来找了个名人博客(当然,新浪的)才发现,Feed中的图片url果然被重新“包装”了,只是其添加的字符串不是上面所言之“http://www.zhuaxia.com/readpic.php?”而且“http://img.zhuaxia.com/readpic.php?”,看来“readpic.php”是抓虾的一个相当重要的文件,位于多个Server上。
从抓虾的角度,也许这样的方式能够让用户浏览时获得较佳的访问体验,避免图片不能显示或显示一个盗链警告之类的图片带来的影响,一切都是“为了用户” 。
深入搜索后得知,原来抓虾的这项技术早已是公开的“秘密”,如这篇如何引用网易、新浪、百度相册上的图片,可以看出抓虾在很大程度上促进了中国互联网领域的开放,极大地冲击了各大门户网站荒谬的“闭关锁国”政策 。也许,抓虾应该大张旗鼓地推广这项服务,肯定会大受欢迎,只不过,盈利点如何寻找则仍然需要抓虾动动脑筋。
防盗链与网站可用性
抓虾在“readpic.php”采用了哪些高深的技术,是不学无术的我懒得研究的——当然,以我的能力,也研究不出个所以然来,——但看到“Name”的提醒后,直觉的第一反应便是可能利用我们防盗链设置中允许空“HTTP_REFERER”访问的漏洞,毕竟,这是所谓的破解防盗链最简单的解决方案。
于是,将 .htaccess 文件中的这一行屏蔽(具体设置可参考Apache下防止图片盗链中的介绍或找份Apache手册看一下)
RewriteCond %{HTTP_REFERER} !^$
将 .htaccess 上传后,再用“http://www.zhuaxia.com/readpic.php?图片url”测试,果然,图片已经不能显示。
但从网站可用性角度看,任何网站都不可能要求必须具有“HTTP_REFERER”才能访问:这会带来很多问题。空“HTTP_REFERER”的情况不仅发生在用户在浏览器地址栏中直接输入图片地址时,也包括其他很多场景,比如说用户通过某些代理服务器访问时,比如说通过收藏访问时,甚至当特定的隐私设置时也会发出空“HTTP_REFERER”的访问请求。
两害择其轻,因此,目前我们的防盗链设置对于抓虾包括使用抓虾提供这项“服务”调用我们图片的情况仍然是“门户大开”的。
对抓虾破解防盗链的疑问
声明:如果您已经厌烦了抓虾了话题,请略过下面的内容。说老实说,我也腻歪透了:用了近一周的时间来讨论抓虾,实在有点不务正业,无论如何,博客学堂讨论的主题应该是博客!
如上文所言,抓虾并不是对所有Feed中的图片url都进行重新“封装”——那样,也许抓虾不得不增加服务器了,不符合“付出最小化利益最大化”的基本原则。 ——而是有选择性地对特定Feed进行相应的处理,而且,看来也不是通过某种自动机制,比如说根据对方网站是否设置了防盗链而自行“封装”url (疑问:目前有准确的判断算法么?),而更像是由人工维护一个是否进行“二次处理”的列表,根据博客的流行度或受欢迎程度,有选择性地处理。从这个角度看,像博客学堂这样的访问量不大的博客是不必担心的,不过,可以想见的是,如果抓虾类似设置不仅应用于BSP——BSP终归是较易处理的,比如说只须针对新浪设置一下,即包涵位于新浪上的成千上万个博客——还应用于独立博客,这个列表的维护恐怕就不是件轻松的事了。(说明:本人在抓虾中并没有找到针对设置图片防盗链的独立博客也应用这一策略的实例)
抓虾在针对特定的网站比如说新浪应用此策略前需事先征得对方网站的同意么?如果没有,这样的策略,包括上面提及的抓虾允许任何人使用此项“服务”调用本身设置了防盗链的网易、新浪、百度相册上图片的情况,会不会存在某种法律上的隐患?当然,我不懂法律,但人家明明关上了门,尽管门可能简陋了些,但你硬要破门而入,或提供某种破门工具,性质总是不难界定的,而现实生活中的小偷恐怕很难用对方“门实在太破了简直诱惑人犯罪”之类的说法为自己寻找免罪的借口。
虽然,在Internet上,是否观念并不那么明确甚至可能正好是颠倒的,比如说网上有各种“高手”提供名目繁多的“破解”工具,比如说如今连很多所谓的采集软件也都将“破解防盗链”作为卖点,但相对而言,那些还都是遮遮掩掩不能公开见光的,而抓虾,则位于聚光灯下啊。
也许,抓虾事先得到了那些网站的许可,或达成了某种程序的默契,毕竟,抓虾在中文RSS阅读器市场的占有率在那放着,任何一个BSP都不可能将其忽略或“阻止”自己的Feed在其上不能完整显示。不过,我个人很怀疑如果这样的话,那些BSP为什么会同意这样的处理方式?直接在图片服务器上为抓虾打开图片访问许可不就得了么?那不更简单也更有效,同时,还免得抓虾的“readpic.php”广泛传播弄得自己的图片防盗链整个机制形同虚设?从这个角度,揣测抓虾本来便有着对于图片“不管你同不同意,我都要显示”的打算似乎更合乎逻辑。
当然,这些都是推测!
为抓虾说句公道话
尽管到目前为止,我仍认为在RSS Feed 改为全文输出中所下的结论,即抓虾的某些行为“相当不规矩甚至可以说Evil”并不过份——事实上,抓虾对防盗链图片的处理更加深了我们的这种印象——但必须客观地说,与许多光鲜的中文网站相比,抓虾并没有多少出格之处,或者说,抓虾并不比那些网站更“不规矩”、更“Evil”。
这是事实,也是现实。