Code笔记 之:防盗链(图片)
图片防盗链
应该是”10种图片防盗的方法“,而不是”10种图片防盗链的方法“,不过看搜索防盗链的人要多一点,所以就用这个关键词了:)
图片防盗和图片防盗链有什么区别呢?
图片防盗: 是不想自己的图片被别人使用。
图片防盗链: 是不想自己的图片被别人使用,且消耗的是自己的服务器流量。
图片防盗是困难的,完美的图片防盗那几乎是不可能的。但还是有很多方法能够减少图片盗用,下面是10种,选一种你喜欢的吧。
隐藏图片
使用空白图片覆盖真实图片
这个方法可以让别人无法获取真实的图片,除非查看源代码。
你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面。
例如:
<div id="image1" style="background-image: url(originalImage.jpg);">
<img src="blank.gif" height="250px" width="300px">
</div>
这样,当别人使用右键查看或保存图片的时候,得到的是这张透明图片。
这里是2个 javascript框架可以实现这种图片防盗链方法:
dwProtector for MooTools
dwProtector for jQuery
自动截切图片
Super Simple Image Tiles
这是一个非常有效的图片防盗链方法.
它支持两种方案:
让用户下载到的是被裁切过的图片。
让用户下载到的是打上水印的图片。
当用户尝试下载图片的时候,它就会进行截切或添加水印操作,但是这个方法也有很大的劣势:
造成太多的服务器请求负荷,对网站整体性能影响不好
你将拥有许多的图片文件
使用带水印的图片 (预先生成)
预先给图片添加水印也是个防止图片被盗的有效方法,就算别人要盗,至少也为你免费宣传了一下自己的网站。
但缺点也来了:
图片会看的不清楚或不美观了(这对于图片展示类的网站尤其重要,但又正是该类网站特尤其图片防盗)
可以下载然后裁剪水印(当然,如果你是那种把水印放在图片中间或水印有图片这么1/3大的家伙,就不用担心这个问题了)
要手动添加水印的话,可以使用photoshop,GIMP,轻松水印等软件。也可以选择下面的一些在线图片水印工具:
PicMarkr(详细介绍)
WatermarkTool
延伸阅读: 8款为图片添加水印的软件
使用水印 (服务器端生成)
使用服务器端自动为图片添加水印,是件省心的事情。只是需要一些脚本知识。
下面是一些相关的各种脚本语言的示例方案:
Asido: PHP Image Processing Library
Asido 是一个PHP图像处理库,可以运行于 GD2, Magick Wand 和 Image Magick.
这里 是 Asido 为图片添加水印的详细说明.
其它PHP 解决方案:
Put watermark on images using PHP
Watermark your images with PHP 5 and GD
Watermark images on the fly in PHP
ASP.NET 解决方案:
Thumbnail and watermark images on the fly with ASP.NET
Watermarking Images in ASP.NET with an HttpHandler
CoolWatermark (paid)
Ruby 解决方案:
RMagick
Watermarking your images with RMagick
P.S:俺偶尔良心发现的时候,会考虑一下版权问题: 这种自动添加水印的方法是为每一张力图片都添加水印,但是否有权利为每张图片都添加水印呢?除非所有的图片是自己原创。或许这也是国外给图片打水印的网站比较少的原因之一。
使用Flash来显示图片
swfIR (详细介绍)
swf image replacement 可以让图片显示于Flash内部,让右键下载变的不可能。
并且,图片仍然可以使用CSS进行样式化。
缺点可想而知: 拖慢网页载入速度。
基于浏览器的图片防盗
禁用右键菜单
通过JavaScript来禁用点键菜单 是图片防盗的一个方法,但它仅仅是对于网络菜鸟来说,中等点的网民可以很轻松的查看到代码获取图片地址,再高等点的可以轻松破解,禁用你的禁用!
所以这并不是一个好方法,更重要的是它是极不利于用户浏览体验的。
这有一个折中的方法,你可以通过一个jQuery 插件 来实现仅仅禁用保存功能.
禁用IE6的图像工具条
在IE6下,当鼠标悬浮在一张图片上时,会出现工具条,上面有保存功能,你可以使用下面的代码禁用:
<meta http-equiv="imagetoolbar" content="no">
图片防盗和图片防盗链有什么区别呢?
图片防盗: 是不想自己的图片被别人使用。
图片防盗链: 是不想自己的图片被别人使用,且消耗的是自己的服务器流量。
图片防盗是困难的,完美的图片防盗那几乎是不可能的。但还是有很多方法能够减少图片盗用,下面是10种,选一种你喜欢的吧。
隐藏图片
使用空白图片覆盖真实图片
这个方法可以让别人无法获取真实的图片,除非查看源代码。
你可以把真实的图片做为背景图片,而使用一张透明图片匹配尺寸并覆盖到真实图片上面。
例如:
<div id="image1" style="background-image: url(originalImage.jpg);">
<img src="blank.gif" height="250px" width="300px">
</div>
这样,当别人使用右键查看或保存图片的时候,得到的是这张透明图片。
这里是2个 javascript框架可以实现这种图片防盗链方法:
dwProtector for MooTools
dwProtector for jQuery
自动截切图片
Super Simple Image Tiles
这是一个非常有效的图片防盗链方法.
它支持两种方案:
让用户下载到的是被裁切过的图片。
让用户下载到的是打上水印的图片。
当用户尝试下载图片的时候,它就会进行截切或添加水印操作,但是这个方法也有很大的劣势:
造成太多的服务器请求负荷,对网站整体性能影响不好
你将拥有许多的图片文件
使用带水印的图片 (预先生成)
预先给图片添加水印也是个防止图片被盗的有效方法,就算别人要盗,至少也为你免费宣传了一下自己的网站。
但缺点也来了:
图片会看的不清楚或不美观了(这对于图片展示类的网站尤其重要,但又正是该类网站特尤其图片防盗)
可以下载然后裁剪水印(当然,如果你是那种把水印放在图片中间或水印有图片这么1/3大的家伙,就不用担心这个问题了)
要手动添加水印的话,可以使用photoshop,GIMP,轻松水印等软件。也可以选择下面的一些在线图片水印工具:
PicMarkr(详细介绍)
WatermarkTool
延伸阅读: 8款为图片添加水印的软件
使用水印 (服务器端生成)
使用服务器端自动为图片添加水印,是件省心的事情。只是需要一些脚本知识。
下面是一些相关的各种脚本语言的示例方案:
Asido: PHP Image Processing Library
Asido 是一个PHP图像处理库,可以运行于 GD2, Magick Wand 和 Image Magick.
这里 是 Asido 为图片添加水印的详细说明.
其它PHP 解决方案:
Put watermark on images using PHP
Watermark your images with PHP 5 and GD
Watermark images on the fly in PHP
ASP.NET 解决方案:
Thumbnail and watermark images on the fly with ASP.NET
Watermarking Images in ASP.NET with an HttpHandler
CoolWatermark (paid)
Ruby 解决方案:
RMagick
Watermarking your images with RMagick
P.S:俺偶尔良心发现的时候,会考虑一下版权问题: 这种自动添加水印的方法是为每一张力图片都添加水印,但是否有权利为每张图片都添加水印呢?除非所有的图片是自己原创。或许这也是国外给图片打水印的网站比较少的原因之一。
使用Flash来显示图片
swfIR (详细介绍)
swf image replacement 可以让图片显示于Flash内部,让右键下载变的不可能。
并且,图片仍然可以使用CSS进行样式化。
缺点可想而知: 拖慢网页载入速度。
基于浏览器的图片防盗
禁用右键菜单
通过JavaScript来禁用点键菜单 是图片防盗的一个方法,但它仅仅是对于网络菜鸟来说,中等点的网民可以很轻松的查看到代码获取图片地址,再高等点的可以轻松破解,禁用你的禁用!
所以这并不是一个好方法,更重要的是它是极不利于用户浏览体验的。
这有一个折中的方法,你可以通过一个jQuery 插件 来实现仅仅禁用保存功能.
禁用IE6的图像工具条
在IE6下,当鼠标悬浮在一张图片上时,会出现工具条,上面有保存功能,你可以使用下面的代码禁用:
<meta http-equiv="imagetoolbar" content="no">
PHP 防盗链
<?php
//php图片防盗链功能
$ADMIN[defaulturl] = "img/no.gif";//盗链返回的地址
$okaysites = array("http://www.5v6.com/","http://t.5v6.com/"); //白名单
$ADMIN[url_1] = "http://t.5v6.com/";//下载地点1
$ADMIN[url_2] = "";//下载地点2,以此类推
$reffer = $HTTP_REFERER;
if($reffer) {
$yes = 0;
while(list($domain, $subarray) = each($okaysites)) {
if (ereg($subarray,"$reffer")) {
$yes = 1;
}
}
$theu = "url"."_"."$site";
if ($ADMIN[$theu] AND $yes == 1) {
header("Location: $ADMIN[$theu]/$file");
} else {
header("Location: $ADMIN[defaulturl]");
}
} else {
header("Location: $ADMIN[defaulturl]");
}
?>
//php图片防盗链功能
$ADMIN[defaulturl] = "img/no.gif";//盗链返回的地址
$okaysites = array("http://www.5v6.com/","http://t.5v6.com/"); //白名单
$ADMIN[url_1] = "http://t.5v6.com/";//下载地点1
$ADMIN[url_2] = "";//下载地点2,以此类推
$reffer = $HTTP_REFERER;
if($reffer) {
$yes = 0;
while(list($domain, $subarray) = each($okaysites)) {
if (ereg($subarray,"$reffer")) {
$yes = 1;
}
}
$theu = "url"."_"."$site";
if ($ADMIN[$theu] AND $yes == 1) {
header("Location: $ADMIN[$theu]/$file");
} else {
header("Location: $ADMIN[defaulturl]");
}
} else {
header("Location: $ADMIN[defaulturl]");
}
?>
你还有其它图片防盗的方法吗? 欢迎分享。
========================
HTTP的REFERER简介($_SERVER['HTTP_REFERER'])
在百度中搜索搜狐,点击链接进去,抓包信息如下:
GET http://www.sohu.com/ HTTP/1.1
Host: www.sohu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.4 (KHTML, like Gecko) Chrome/16.0.889.0 Safari/535.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://www.baidu.com/s?tn=baidusite&word=�Ѻ�
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: www1=w:1; vjuids=26e753894.132e8ab7273.0.c409be1c; sci12=w:1; ent12=w:1; gn12=w:1; IPLOC=CN1200; SUV=1110092031152327; SOHUHOMETAB=visit:2; TurnAD9=visit:3; TurnADzs19=visit:1; TurnADzs20=visit:2; TurnAD351=visit:2; TurnAD119=visit:1; TurnAD118=visit:2; TurnAD10=visit:2; TurnAD120=visit:3; TurnAD11=visit:2; TurnAD414=visit:1; TurnAD415=visit:1; TurnAD349=visit:3; TurnADfankaniu=visit:2; TurnADab10e888e532c9887794784e83c9504c=visit:1; www0=w:1; FULL=w:1; COUPLET=w:1; tiyu11=w:1; tiyu12=w:1; vjlast=1318163543.1318741656.11
If-Modified-Since: Sun, 16 Oct 2011 05:01:04 GMT
其中红色部分就是访问www.sohu.com时,HTTP请求中的Referer,表示通过百度搜索关键字’搜狐’,点击链接跳转而来。
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
Referer其实应该是英文单词Referrer,不过拼错的人太多了,所以编写标准的人也就将错就错了。
关于HTTP Referer使用非常简单,使用场合比较多的是用于页面统计、资源防盗链等,但还是有一点值得注意的是:Referer是不安全的,客户端可以通过设置改变 Request中的值,尽量不要用来进行安全验证等方面。
Referer是不安全的,客户端可以通过设置改变 Request中的值,尽量不要用来进行安全验证等方面;下面介绍下默认情况下Referer可能出现为空的场景:
1、页面从https跳转到http,应该是处于安全考虑,该点在RFC-2616中有说明,主流浏览器均遵守这个规则,比如IE、FF;但默认情况下https到https是会发送Referer的。
2、直接在浏览器中输入目标URL。
3、由于FF提供了很强大的自定义参数设置功能,所以我们可以通过about:config页面修改以下两个选项的默认设置:network.http.sendRefererHeader (default=2),设置Referer的发送方式,0为完全不发送,1为只在点击链接时发送,在访问页面中的图像什么的时候不发送,2为始终发送。network.http.sendSecureXSiteReferrer (default=true),设置从一个Https访问到另外Https页面的时候是否发送Referer,true为发送,false为不发送。
4、从收藏夹访问。
5、单击’主页’或者自定义的地址
6、用js来window.open等方式打开(还有location.href,location.replace())。
在PHP中可以通过预定义变量$_SERVER获取HTTP的Referer,即:$_SERVER['HTTP_REFERER']。
Apache利用HTTP_Referer防盗链
Posted on 2011 年 10 月 16 日
呼叫中心企业后台管理系统和前台座席系统页面中都有通话记录录音的试听和下载功能,如何在用户试听和下载录音的时候不暴露录音地址或者录音地址不能被盗用呢?这就涉及到mp3,图片等资源的防盗链问题。
简单的,我们可以用HTTP请求header中的referer判断,只要referer是内部网站的地址或者可信任的地址,就可以访问相应资源。通过Apache的FilesMatch配置可以实现,在Apache的配置文件httpd.conf中加入:
SetEnvIfNoCase Referer “^http://www.example.com” local_ref=1
SetEnvIfNoCase Referer “^http://test.example.com” local_ref=1
<FilesMatch “\.(txt|doc|mp3|zip|rar|jpg|gif)”>
Order Allow,Deny
Allow from env=local_ref #referer为www.example.com或test.example.com的请求
Allow from 127.0.0.1 #本机地址
</FilesMatch>
其中SetEnvIf指令根据客户端的请求属性设置环境变量,SetEnvIfNoCase代表当满足某个条件时,为变量赋值,一般结合其他指令使用。
也可以使用正则表达式:
SetEnvIf Referer “^http://(.)+\.ilinux\.cn/” local_ref=1
SetEnvIf Referer “^http://(.)+\.isql\.cn/” local_ref=1
SetEnvIf Referer “^http://(.)+\.other\.org\.cn/” local_ref=1
SetEnvIf Request_URI “/logo(.)+” local_ref=0
<FilesMatch “\.(mp3|wmv|png|gif|jpg|jpeg|avi|bmp|ram|rmvb|rm|rar|zip|mp3)”>
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
以上配置方式都还也写到.htaccess,使用.htaccess文件也会存在一些问题,比如性能。如果使用.htaccess文件,则Apache需要在每个目录中查找该文件,还必须在所有更高级的目录中查找它,另外,每次请求一个页面时,也都需要读取.htaccess文件。因此,允许使用.htaccess文件都会导致性能的下降。
例如,对/var/www/htdocs中页面的请求,Apache必须查找以下文件:
/.htaccess
/var/.htaccess
/var/www/.htaccess
/var/www/htdocs/.htaccess
总的来说,通过.htaccess来保护网站更为方便和灵活。
最后还可以用Apache的mod_rewrite模块等进行防盗链。
文章参考及转载自:http://www.linuxidc.com/Linux/2008-05/12924.htm
http://hi.baidu.com/smallfish7788/blog/item/1b2e1dd9a5944e3033fa1cb1.html
--------------------------------------------------------------
由于个人对技术知识的表达不是很专业,还望各位看官
多多见谅,多多评论,多多指导!
不吝赐教~(~_~)
---------------------------------------------------------------
撰写日期:2016-06-14 11:01:25
更新时间:2016-06-20 11:01:04