请教如何防止图片盗链,现在在很多网站上打开别的网站图片好像都会转到一个图片上,这个又怎么实现的呢?

2011-01-05 16:08:14

5 Answers

目前大多数网站(例如百度空间等)都是通过HTTP头的Referer来判断的,可以限制你的Referer不是来自允许的域名就会被转向,目前的主流Webserver都可以通过配置达到效果,我这里就不再详述了,给你提供两个配置,分另为Apache和Nginx针对Referer的防盗链

2011-01-05 18:31:00

通过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]
2011-01-05 19:40:16

这种设置如果是基于Referer 判断的话,根本不能真正的防止盗链,例如

百度的图片和很多网站防盗链措施一样,是基于Referer 判断 的
1. 如果浏览器发送的Referer 中不是从百度的域过来的,则判断为盗链
2. 如果浏览器没有发送Referer 头,则认为是不是 盗链

原来如此简单啊,这里进行了 百度 百度知道 和 javaeye 的测试 , 结果全部通过:

<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'/>");


“典型的就是从 https 跳到 http 会被浏览器拒绝发送 referer,因为可能会导致敏感信息泄露。” 实际上这句话包含了另外一种阻止发送referer的通用方式,而且是不需要javascript支持的。 即:利用在https下的一个第三方提供redirect的接口,重定向到 http 的一个页面,是不发送referer的。 最著名最好用的就是google了。 harry说他一直用google的一个重定向,不过我没找到google的直接跳转的地方。
2011-01-05 20:52:05

答案来源:BlogsDiy

相信很多朋友都曾遇到过网站内文件特别是图片被盗链的情况。所谓盗链,是指对方网站直接链接您网站上的文件,而不是将其置于自己的服务器上,一般而言,盗链的对象大多为较耗带宽的大体积文件,如图片、视频等,从某种意义上说,这事实上造成了让您为其访问流量买单:不仅您的服务器带宽被无任何回报地占用,而且,往往会在很大程序上影响您网站的访问速度。

当然,从严格的道德与法律角度讲,对方网站就算不盗链,就算将文件拷贝到其自己的服务器使用,也应首先征得您的许可。不过,在Internet世界里破坏规则往往是不必付出代价的,这也使得许多人习惯了在网站建设中使用别人的内容与资源,源网站自身对此是无能为力的。这方面中文网站更是位于“世界领先”的地位,在中华传统“文化”的熏陶与教育大跃进的共同作用下,与鬼子们对抄袭、盗链大都还遮遮掩掩相比,中文网站往往非但不以为忤反而理直气壮,“窃书不算偷”甚至“窃你的书是看得起你”之类的说辞甚至成为主流。去年笔者就曾遇到过一位“极品男”,因我的某个网站图片被盗链严重,服务器带宽被大量占用,而不得不采用最原始的防盗链手段——那个网站因使用IIS,而且未安装Mod_rewite功能扩展模块——即改变图片文件存储目录与文件名的方式,结果却收到某个盗链网站的抗议,义正辞严地指责我那么做是如何如何地不道德,给他带来了多大的麻烦:他不得不逐个修改每个网页以让图片能够正确显示,并谆谆教导我保持图片url恒定不变才显得更为专业等,让人啼笑皆非。

虽然这类人中龙风不太常见,但是,对于原创网站而言,在网站建设的最初阶段便“断绝”与其往来,一开始便禁止其盗链也许是更佳的选择,当然,也可以为极品男省去很多麻烦。

防止文件盗链目标与要求
统一在网站根目录下的 .htaccess 设置:虽然理论上而言,在Apache中,可以针对每个目录分别设置 .htaccess ,通过权限的继承与覆盖可以实现相当复杂的功能。不过,过多的 .htaccess 往往会增加管理的难度,有时候百密难免有一疏,修改 .htaccess 稍有遗漏便可能造成网站出现问题。
默认情况下禁止其他网站盗链:对图片文件而言,当其他网站使用 盗链时自动重定向至类似右图所示的图片,声明版权及宣传您的网站。当然,从降低对服务器带宽占用的角度考虑,这个图片文件不能过大,您也可以简单地拒绝其访问,让其网页上图片位置以红“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)盗链的设置与此类似,不再赘述。

2011-01-05 22:37:57

1.将图片放入数据库中,使用blob或者其他的大字段从数据库中读出;
2.在图片链接的后面加入一个验证码,读取的时候判断验证码来判断是否可以给用户请求来响应
3.最最简单的方法:图片上加上水印,打上公司的logo
4.IIS加入防盗链的设置,

<httpHandlers> <add verb="*" path="*.jpg" type="myhandler,App_Code"/> </httpHandlers>

2011-01-06 00:21:40
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制