Apache-如何防止图片盗链
请教如何防止图片盗链,现在在很多网站上打开别的网站图片好像都会转到一个图片上,这个又怎么实现的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
请教如何防止图片盗链,现在在很多网站上打开别的网站图片好像都会转到一个图片上,这个又怎么实现的呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
这种设置如果是基于Referer 判断的话,根本不能真正的防止盗链,例如
百度的图片和很多网站防盗链措施一样,是基于Referer 判断 的
1. 如果浏览器发送的Referer 中不是从百度的域过来的,则判断为盗链
2. 如果浏览器没有发送Referer 头,则认为是不是 盗链
原来如此简单啊,这里进行了 百度 百度知道 和 javaeye 的测试 , 结果全部通过:
代码 如下:
Php代码 收藏代码
<script>
window.sc=[];
//window.sc['if-sc1'] = "<img src='http://hiphotos.baidu.com/54nop/pic/item/939407fb49f406266c22eb5e.jpg?"+Math.random()+"'>";
window.sc['if-sc2'] = "<img src='http://tb.himg.baidu.com/sys/portrait/item/5a8a7a616b74313232343837dc02?"+Math.random()+"'>";
window.sc['if-sc3'] = "<img src='http://www.iteye.com/upload/logo/user/35330/4e311ac1-0916-340c-83bf-e343e6f44427-thumb.jpg?"+Math.random()+"'>";
</script>
<!--
图片 太大 不好截图
<iframe id='if-sc1' src="javascript:parent.sc['if-sc1']" onload="javascript:var x=document.getElementById('if-sc1').contentWindow.document.images[0];
this.width=x.width+10;this.height=x.height+10;" style="border:0px;overflow:hidden;"
scrolling="no" frameborder="0" ></iframe>
-->
<br/>
<iframe id='if-sc2' src="javascript:parent.sc['if-sc2']" onload="javascript:var x=document.getElementById('if-sc2').contentWindow.document.images[0];
this.width=x.width+10;this.height=x.height+10;" style="border:0px;overflow:hidden;"
scrolling="no" frameborder="0" ></iframe>
<br/>
<iframe id='if-sc3' src="javascript:parent.sc['if-sc3']" onload="javascript:var x=document.getElementById('if-sc3').contentWindow.document.images[0];
this.width=x.width+10;this.height=x.height+10;" style="border:0px;overflow:hidden;"
scrolling="no" frameborder="0" ></iframe>
<hr/>
<?php
echo("<img src='http://hiphotos.baidu.com/54nop/pic/item/939407fb49f406266c22eb5e.jpg'/>");
echo("<img src='http://www.iteye.com/upload/logo/user/35330/4e311ac1-0916-340c-83bf-e343e6f44427-thumb.jpg'/>");
die("<img src='http://tb.himg.baidu.com/sys/portrait/item/5a8a7a616b74313232343837dc02'/>");
参见
http://vb2005xu.iteye.com/blog/758306
“典型的就是从 https 跳到 http 会被浏览器拒绝发送 referer,因为可能会导致敏感信息泄露。”
实际上这句话包含了另外一种阻止发送referer的通用方式,而且是不需要javascript支持的。
即:利用在https下的一个第三方提供redirect的接口,重定向到 http 的一个页面,是不发送referer的。
最著名最好用的就是google了。 harry说他一直用google的一个重定向,不过我没找到google的直接跳转的地方。
POC大致如下:
<img src=https://www.xxx.com/redirect?target=http://www.baidu.com/xxx.jpg />
答案来源:BlogsDiy
相信很多朋友都曾遇到过网站内文件特别是图片被盗链的情况。所谓盗链,是指对方网站直接链接您网站上的文件,而不是将其置于自己的服务器上,一般而言,盗链的对象大多为较耗带宽的大体积文件,如图片、视频等,从某种意义上说,这事实上造成了让您为其访问流量买单:不仅您的服务器带宽被无任何回报地占用,而且,往往会在很大程序上影响您网站的访问速度。
当然,从严格的道德与法律角度讲,对方网站就算不盗链,就算将文件拷贝到其自己的服务器使用,也应首先征得您的许可。不过,在Internet世界里破坏规则往往是不必付出代价的,这也使得许多人习惯了在网站建设中使用别人的内容与资源,源网站自身对此是无能为力的。这方面中文网站更是位于“世界领先”的地位,在中华传统“文化”的熏陶与教育大跃进的共同作用下,与鬼子们对抄袭、盗链大都还遮遮掩掩相比,中文网站往往非但不以为忤反而理直气壮,“窃书不算偷”甚至“窃你的书是看得起你”之类的说辞甚至成为主流。去年笔者就曾遇到过一位“极品男”,因我的某个网站图片被盗链严重,服务器带宽被大量占用,而不得不采用最原始的防盗链手段——那个网站因使用IIS,而且未安装Mod_rewite功能扩展模块——即改变图片文件存储目录与文件名的方式,结果却收到某个盗链网站的抗议,义正辞严地指责我那么做是如何如何地不道德,给他带来了多大的麻烦:他不得不逐个修改每个网页以让图片能够正确显示,并谆谆教导我保持图片url恒定不变才显得更为专业等,让人啼笑皆非。
虽然这类人中龙风不太常见,但是,对于原创网站而言,在网站建设的最初阶段便“断绝”与其往来,一开始便禁止其盗链也许是更佳的选择,当然,也可以为极品男省去很多麻烦。
防止文件盗链目标与要求
统一在网站根目录下的 .htaccess 设置:虽然理论上而言,在Apache中,可以针对每个目录分别设置 .htaccess ,通过权限的继承与覆盖可以实现相当复杂的功能。不过,过多的 .htaccess 往往会增加管理的难度,有时候百密难免有一疏,修改 .htaccess 稍有遗漏便可能造成网站出现问题。
默认情况下禁止其他网站盗链:对图片文件而言,当其他网站使用 <img src=’http://yoursite.com/someimg’> 盗链时自动重定向至类似右图所示的图片,声明版权及宣传您的网站。当然,从降低对服务器带宽占用的角度考虑,这个图片文件不能过大,您也可以简单地拒绝其访问,让其网页上图片位置以红“x”号代替。
允许特定访问来源:单纯针对图片文件来说,事实上也不可能禁止所有除您自身网站之外的其他访问,比如说Google,如果您希望通过Google图片搜索获得一定访问的话,必须让其能够正确读取真正的图片文件,再如应能够让RSS订阅用户看到feed中的图片,这就要求允许来自bloglines等的访问。
允许特定目录下的文件被外部网站使用:完全禁止外部网站有时会带来不便,很多时候,我们自己也可能需要在外部网站使用部分文件。当然,放入这些目录的文件要有一定限制,不然,便失去设置防盗链的意义了。
设置 .htaccess 禁止图片盗链
下面即为博客学堂禁止图片盗链的 .htaccess 设置部分:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/(allow1|allow2)
RewriteRule ^.*$ - [L]
首先,设置允许可“盗链”即外部网站可以使用的文件所处目录,上面我们设置了两个目录,分别为allow1与allow2,当然,如果您只有一个目录的话,可以将其改为:
RewriteCond %{REQUEST_URI} ^/allow1
接下来判断是否为图片文件:
RewriteCond %{REQUEST_FILENAME} .(gif|jpeg|png)$ [NC]
您也可以根据自己的需要设置更多的文件类型。
RewriteCond %{HTTP_REFERER} !^$
上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。
RewriteCond %{HTTP_REFERER} !blogsdiy.org [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteCond %{HTTP_REFERER} !bloglines.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner.com [NC]
设置允许访问的HTTP来源,包括博客学堂自身、Google、Baidu、Bloglines、Feedburner等。
RewriteRule (.*) /allow1/leech.gif [R,NC,L]
将不满足上述条件的访问重定向至leech.gif。您可能已经注意到,leech.gif位于允许“盗链”的目录allow1下,这一点很重要,不然,您的警告信息图片将无法在对方网站上显示。
如此,即实现了我们预先设定的防止图片盗链目标。
其他类型文件的防盗链设定
如果您的网站上存在其他类似体积较大较耗费带宽的文件如flash、mp3被其他网站盗链,可以同样采取上述策略,比如说,对Flash文件,可用类似如下的设置:
RewriteCond %{REQUEST_URI} ^/allow1
RewriteRule ^.$ - [L]RewriteBase /
RewriteCond %{REQUEST_FILENAME} .swf$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !blogsdiy.org [NC]
(……其他允许访问来源)
RewriteRule (.) /allow1/leech.swf [R,NC,L]
当然,需要事先创建一个声明版权信息的flash文件“leech.swf”。其他诸如防止mp3文件、压缩文件(zip或rar)盗链的设置与此类似,不再赘述。
1.将图片放入数据库中,使用blob或者其他的大字段从数据库中读出;
2.在图片链接的后面加入一个验证码,读取的时候判断验证码来判断是否可以给用户请求来响应
3.最最简单的方法:图片上加上水印,打上公司的logo
4.IIS加入防盗链的设置,
<httpHandlers>
<add verb="*" path="*.jpg" type="myhandler,App_Code"/>
</httpHandlers>
目前大多数网站(例如百度空间等)都是通过HTTP头的Referer来判断的,可以限制你的Referer不是来自允许的域名就会被转向,目前的主流Webserver都可以通过配置达到效果,我这里就不再详述了,给你提供两个配置,分另为Apache和Nginx针对Referer的防盗链
Apache:http://www.vonvey.com/?p=42
Nginx:http://blog.sina.com.cn/s/blog_87f373520100v5kl.html
通过rewirte实现
Nginx防盗链
location ~* .(gif|jpg|png|swf|flv|bmp)$ {
valid_referers none blocked *.itwhy.org itwhy.org;
if ($invalid_referer) {
rewrite ^/ http://www.itwhy.org/nolink.gif;
}
}
Apache防盗链
Apache 防盗链需要加载mod_rewrite.so模块。
httpd.conf 或 .htaccess 文件里面加入如下语句
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://itwhy.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://itwhy.org$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.itwhy.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.itwhy.org$ [NC]
RewriteRule .*.(png|gif|jpg|swf|bmp|flv)$ http://www.itwhy.org/nolink.gif [R,NC]
IIS防盗链
IIS支持UrlRewrite吗?答案:不支持。但是我们可以通过安装第三方服务器扩展让IIS支持。目前有一种产品能比较好地支持IIS的UrlRewrite,名字叫ISAPI_Rewrite。
httpd.ini里面加入如下语句
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://1.*).*
RewriteRule .*.(?:gif|jpg|png|swf|flv|bmp) /nolink.gif [I,O]
内容摘自 http://www.itwhy.org/2011/10-02/1270.html