Code笔记 之:防盗链(图片)

时间:2021-10-31 10:08:29
图片防盗链
 
 
应该是”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">

 
 
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]"); 
}

?>

你还有其它图片防盗的方法吗? 欢迎分享。
 
========================
 
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

Code笔记 之:防盗链(图片)的更多相关文章

  1. Nginx防盗链的3种方法 文件防盗链 图片防盗链 视频防盗链 linux防盗链

    Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品,目前Web服务器调查显示Apache下降Ngni ...

  2. 部分网站允许空白referer的防盗链图片的js破解代码

    Reference: http://www.114390.com/article/27125.htm Javascript源码: 复制代码代码如下: function showImg( url ) { ...

  3. nginx配置图片防盗链

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 30d; access_log off; valid_referers none blocked ...

  4. HTTP 笔记与总结(6)referer 头与防盗链

    在百度贴吧(或 QQ 空间等)中找到一张图片,复制图片地址,在站外通过 img src 引用,会发现: 此外,在一些统计软件中,统计访客的来路(直接访问.外部链接.搜索引擎),都用到了 HTTP 协议 ...

  5. Java破解图片防盗链

    前言 今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额.然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念.哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们 ...

  6. nginx防盗链配置

    Ps:防盗链的意义就是保证自己的版权,不免网站的流量流失,为他人做嫁衣.下面是网上看到的三种方法: 修改 /usr/local/nginx/conf/nginx.conf 这个配置文件.找到locat ...

  7. 05 referer头与防盗链

    像上图中的这个效果,当我们在网页里引用站外图片时,常出现这样的情况. ??? 服务器是怎么样知道,这个图片是在站外被引用的呢? 还有在网站的统计结果,统计用户从何而来,如下图 ??? 统计时,是如何得 ...

  8. php防盗链技术

    在Http协议中,头信息里,有一个重要的选项: Referer Referer: 代表网页的来源,即上一页的地址 如果是直接在浏览器上输入地址,回来进来,则没有Referer头. 这也是: 为什么服务 ...

  9. Nginx跨域访问场景配置和防盗链

    跨域访问控制 跨域访问 为什么浏览器禁止跨域访问 不安全,容易出现CSRF攻击! 如果黑客控制的网站B在响应头里添加了让客户端去访问网站A的恶意信息,就会出现CSRF攻击 Nginx如何配置跨域访问 ...

随机推荐

  1. 一、JSP、servlet、SQL三者之间的数据传递&lpar;前台与后台数据交互&rpar;

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

  2. Linq操作非泛型集合

    我们都知道,Linq能查询泛型集合,确切的说是:LINQ能实现查询泛型对象或者实现了IEnumerable.但是,很遗憾的是诸如ArrayList这样的非泛型集合并没有实现IEnumerable.那咋 ...

  3. PHP 与pdf文档 与条码

    必要的步骤 1.导入require_once "tcpdf/tcpdf.php"; 工具源码在demo中 2.$pdf = new TCPDF("P", &qu ...

  4. 非编码RNA

    生命的基本过程是从DNA转录成mRNA,再翻译成蛋白质发挥功能.DNA就像一张绝密的密码图,不能随意被移动,只能被锁在细胞核里.要想知道这些密码,只能像复印一样,将密码图复印到mRNA上,由它们把这些 ...

  5. Spring AOP中pointcut expression表达式解析 及匹配多个条件

    Spring中事务控制相关配置: <bean id="txManager" class="org.springframework.jdbc.datasource.D ...

  6. ExtJs之Ext&period;util&period;Format

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  7. Android root 原理

    Android root 原理 0x00 关于root linux和类Unix系统的最初设计都是针对多用户的操作系统,对于用户权限的管理很非常严格的,而root用户(超级用户)就是整个系统的唯一管理员 ...

  8. &lbrack;xml解析&rsqb;rapidxml读取文件

    因为项目需要读取xml配置文件,在原来调查一番后,项目组使用了tinyxml. tinyxml确实简单,非常清楚的就把读取方案写出来了.但是,由于后期xml文件越来越大(2.5M,大概1w多行数据), ...

  9. JPA2&period;1 中三个提升应用性能的新功能

    经常在网上看到开发者们抱怨 JPA 性能低下的帖子或文章,但如果仔细查看这些性能问题,常会发现导致问题的根本原因大致包括以下几个: 使用过多的 SQL 查询从数据库中获取所需的实体信息,即我们常说的n ...

  10. Extjs4 操作TreeStore 处理proxyAjax 获取的数据

    近期在搞extjs4 TreeStore时有一个需求 就是要处理一下后台传过来的json数据然后再显示,看api也没有找到解决的方法 ,最后看源代码在Ext.data.proxy.Server 看到这 ...