现在很多大网站都有了图片反盗链,于是有时候在某些论坛或者博客就会遇到些“此图片仅限于…用户之间交流与沟通”的图片,这真是无法理喻。
反盗链
引用一段话:来自http://www.ningoo.net/html/2007/get_away_from_photo_defense.html
这里忍不住再次提起这茬,是在豆瓣九点看blog的时候,时不时冒出一副“此图片仅限于…用户之间交流与沟通”的图片出来,一个字,烦。不让看你干脆将所有的img直接过滤掉不显示就好了,还TMD放这么恶心的一个东西来刺激我的眼睛,要知道我眼睛本来就不太灵光,还好心脏不错,不然搞不好弄出人命官司。Blog和网页有啥区别?我想区别就在于我可以通过rss聚合阅读而不必要跑到blogger的网站上去吧。要是你输出的东西这不能看,那仅限于,那还搞个屁的rss。
图片防盗链,请离blog远点。呼吁所有的blogger,离图片防盗链的XX网站远点,不然,你们的内容再好,也只能敬而远之了。
这个我深有同感。
基本大部分网站的反盗链都是通过HTTP Headers里面的Referer属性来判断是否盗链。
如果Referer来源不是他们的网站,他们会直接返回一个意思类似“你盗我链”的图片,或者直接404。
有的网站还算有的人性,如果Referer为空的话,他们会放过这个请求。
像在Apache下,我们可以轻松用rewrite模块来实现图片的反盗链。
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www.)?EverET.org(/)?.*?EverET.org(/)?.)$ [NC] RewriteCond %{HTTP_REFERER} !^http://(www.)?EverET.org(/)?.*?EverET.org(/)?.)$ [NC] RewriteRule .*.(gif|jpg|jpeg|bmp|png)$ http://www.EverET.org/nohotlink.xjpg [R,NC]
也就是看看HTTP Headers中Referer是不是自己的网站,不是就返回一个nohotlinks.xjpg的图片。
反“反盗链”
下面我们来看看百度的图片。
页面源代码如下:
打开页面后会发现img标签的图片是一张“仅供XX交流的图片”, 而在iframe里面的img可以正确显示:
对于上面那张“该图片仅供XX用户交流使用”的HTTP请求的Headers如下图:
它直接返回了一个“仅供XX交流的”
对于下图显示出来的周总理的照片,它的请求如下,很明显可以看到少了Referer这个属性。
进化
现在,我们可以通过javascript来让图片显得更美观,我们将iframe的大小设置到和图片大小一致,然后去掉边框,于是就看不出图片是在一个iframe里面了。于是我们就可以看到我们敬爱的周总理而不是“仅供XX用户交流使用”。
页面源码:
hotlink_under_id这个函数可以将在某个id的标签下的所有的图片自动变成iframe,实现突破允许referer为空的反盗链。
javascript代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
我们来看另一个网站的反盗链。它同样也是
我们可以在http://everet.org/2012/02/the-http-status-code.html看到HTTP状态码是302Found:类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。
而301是Moved Permanently。客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
看报文是被Apache重定向了。