资源被盗链:(简明定义)
下载者不是从你的网站直接下载资源,而是通过其他盗链网站提供的你的下载资源链接进行下载你的服务器资源!
http://baike.baidu.com/view/272422.htm
一》预防方法:
方法1:判断引用地址
这个方法是最早及最常见的方法。所谓判断引用地址,就是判断浏览器请求时HTTP头的Referer字段的
值,这个值在asp.net里面可以用 Request.UrlReferrer属性取得。几个例子来说,在正常情况下当用户在浏览
http://uushare.com/abc.html 时点击一个链接去到 http://uushare.com/jacky.mp3
文件时,浏览器在发出请求jacky.mp3
资源时还会附带当刻浏览器所处的页面地址(即http://uushare.com/abc.html),所以当你的网站程序接收到下载
jacky.mp3 资源请求的时候,先判断http的referer字段的值,如果是从
自己的域名(uushare.com)过来的,则可以认为是合法的连接请求,否则就返回一个错误的提示信息。
这种方法通常用于图片、
mp3这种容易被人用html“嵌入”到其他网站的资源,使用这种方法可以防止你的图片直接出现在别人的网页里(或者防止mp3直接被其他网站嵌入到
flash播放器里),不过访客使用下载工具还是可以轻松下载,因为现在的下载工具一般会自动用你的域名构造一个引用地址,所以如果想再进一步防范的话,
可以使用一个对应表限制每个资源的引用地址,例如将 jacky.mp3 的引用地址限制为
http://uushare.com/abc.html?id=12345,这样下载工具就不太可能构造一个“正确”的引用地址了。
方法2:使用登录验证
这
个方法常见于论坛、社区。当访客请求网站上的一个资源时,先判断此请求是否通过登录验证(在asp.net里常用session或form验证来记录登录
状态),如果尚未登录则返回一个错误提示信息。使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。
不过因为登录状
态依赖于会话id,而会话id往往储存于http请求的cookie字段里,下载工具一般没法获得浏览器的cookie字段,所以这些资源往往无法使用下
载工具来下载,给正常合法用户带来诸多不便(因为大部分网民的系统都安装了下载工具,一点击下载链接一般会被下载工具拦截,导致无法使用浏览器本身的下载
功能)。简单的解决方法是将这个session id放到URL中。
这种方法的另外一个缺点是访客无法匿名下载,所以这个方法一般只用于论坛和社区网站。
方法3:使用cookie
其
实这种方法原理上跟方法2差不多。就是在显示“下载”链接的页面里产生一个动态值的cookie,然后在处理资源下载请求时先判断cookie里有没有正
确的cookie,如果没有则返回错误提示信息。至于这个动态值如何产生,只要能逆向判断动态值是否合法的都可以,例如将当前的时间去除秒数取哈希值(也
叫散列值)。如果网页程序是asp.net则更简单,可以往Session里随便存一个字符串或数字,然后在处理下载请求时先检查Session里是否存
在这个字符串或数字。使用这个方法的缺点跟方法2一样。
方法4:使用POST下载
客户端浏览器请求资源都是使用
HTTP的GET方法的,其实使用POST方法也可以往客户端返回数据。所以可以将下载链接换成一个表单(Form)和一个按钮(Submit),将待下
载的文件的名称或id放到表单的一个隐藏文本框(Input)里,当用户点击提交按钮时,服务程序先判断请求是否为POST方式,如果是则读取目标资源的
二进制数据并写入响应对象(在asp.net里是respone.BinaryWrite方法)。
使用这个方法的缺点同样是无法使用下载工具,更没法实现断点续传。 不过比方法2,3好一点的是,下载工具不会拦截你的下载动作,所以正常用户还是比较顺畅地下载到文件。这个方法比较适合小文件的下载。
方法5:使用图形验证码
使用这个方法可以保证每次下载都是“人”在你的网站上下载,而不是下载工具。因为网上很多介绍使用图形验证码的方法,所以这里就不再重复了。这个方法的缺点是比较容易让正常的用户感到麻烦。
方法6:使用动态文件名
也
叫动态钥匙法,当用户点击一个下载链接时,先在程序端计算一个Key(使用一定规律产生的Key,最好不要使用随机字符串例如GUID,并且这个Key必
须有一定时效的),然后在数据库或Cache里记录这个Key以及它所对应的资源ID或文件名,最后让网页重定向一个新的URL地址,这个新URL地址里
需要包含这个Key。当浏览器或下载工具发出下载请求时,程序先检测这个Key是否存在,如果存在则返回对应的资源数据。
使用这个方法的好处是下载工具也可以下载,并且在Key失效前可以断点续传,并且可以通过Key来控制下载的线程数。
使
用这个方法(包括以上所有支持下载工具的方法)的缺点是:当任意一个用户下载成功之后,你的资源就会被一些下载工具列入“资源候选名单”,以后其他人在其
他地方下载同样的文件时,下载工具会不断连接你的服务器,即使你的文件已经删除或者Key已经失效了,这样会造成类DDos攻击的后果,下面再介绍两个即
可以让下载工具下载,又可以防止盗链的方法。
方法7:擅改资源的内容
一般热门的资源都是电影、mp3、较大的压缩
包等,这些文件都是有很多可以插入数据的地方的,例如mp3有一个tag区,rar/zip有一个备注区,电影的内容随便一个地方,只要在下载过程当中,
动态地往这些地方注入一些随机的字节(几个字节即可),就可以达到让整个文件的哈希值(即散列值、指纹值)发生改变,让从你网站下载的文件的哈希值跟别人
的不一样,就可以防止下载工具主动找上门了。用这个方法配合方法6,可以达到较好的防盗链的效果。缺点是,虽然文件被修改的部分不会被“看”、“听”出
来,不过多多少少让知道的人觉得不爽。另外就是如果别人把从你网站下载的文件放到其他网站,那么仍然存在下载工具主动找上门的情况(虽然实际上它下载不了
内容)。
方法8:打包下载
这个方法跟方法7的道理是一样的,只不过这次不是往原始文件里修改,而是在原始的文件基
础上再加个“外壳”,让资源的哈希值跟别人的不一样。使用这个方法可以在不擅改资源原始的内容基础上实现方法6同样的效果,并且狠一点的话,甚至可以在打
包的时候放入自己的一些广告。缺点是用户每次下载都得加压缩,不过目前大部分人都懂得解压,所以这个缺点有时可以忽略不计。
http://blog.csdn.net/zhanglei5415/article/details/3611365
二》破解技巧:(原创)
方法1:browser > source codes > edit as html
方法2:编写javascript 爬虫,拼凑,收集有关资源链接
express 防盗链模块:
安装
npm install express-anti-leech
使用
var express = require(‘express‘),
path = require(‘path‘),
app = express();
var AntiLeech = require(‘express-anti-leech‘);
// 允许引用的域名白名单
var hosts = [‘localhost‘, ‘localhost:8004‘];
// 反盗链类型
var exts = [‘.png‘, ‘.jpg‘, ‘.jpeg‘, ‘.gif‘, ‘.swf‘, ‘.flv‘];
// 盗链默认指向图片
var pictrue = "/images/default.png";
app.use(AntiLeech({
allow: hosts,
exts: exts,
log: console.log, // 你也可以使用自己的方法来记录
default: pictrue
}));
// 请在调用静态资源之前先使用反盗链模块
app.use(express.static(path.join(__dirname, ‘public‘)));
app.set(‘port‘, process.env.PORT || 8004);
app.get(‘/‘, function(req, res) {
res.redirect("/index.html");
});
app.listen(app.get(‘port‘), function() {
console.log("Express test server listening on http://localhost:" + app.get(‘port‘));
});
测试效果图:
localhost:8004
在白名单之中,而 127.0.0.1:8004
不在白名单中,所以 localhost:8004
下访问正常,而 127.0.0.1:8004
下则被重定向到指定的图片。
Nginx 反盗链设置:
防止盗链不仅能保护版权,又节约了不少流量。最近和bsdmap交流了下,听说他们通过防盗链节约了近1/3的图片流量。nginx的防盗链设置还是比较简单的,可以分为普通防盗链和ip/cookie based防盗链。其中ip based防盗链需要安装nginx的module,所以相对麻烦一些。
nginx最简单的防盗链设置如下
location ~* .(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com;
if ($invalid_referer) {
return 403;
}
}
通过nginx的重定向方式返回403错误。
NginxHttpAccessKeyModule实现防盗链
需要先安装nginx的NginxHttpAccessKeyModule模块。其运行方式是:如我的nginx目录下有一个 file.gz 的文件。对应的URI 是http://www.jefflei.com/nginx/file.gz
若用ngx_http_accesskey_module 后则根据用户的IP生成一个key值,如下的链接来访问http://www.jefflei.com/download/file.zip?key=23497sdf897. 只有给定的key值正确了,才能够下载nginx目录下的file.gz,这样就可以避免被盗链了。
浅谈网站防盗链技术:
一、 初级 -- 经常更换音乐文件及其所在文件夹的名称。
这种方法最简单,最原始,只要发现服务器流量不正常了,就把后台打开点击更新资源地址,程序就自动修改资源名称。这样一来被盗链的地址就马上失效了。
缺点:由于资源够多,更新起来很占服务器资源,时间够长到后来,每更新一次几乎要用一个通宵。而且由于当时程序处理不够周密,每更新一次基本上都会出现一些错误链接。而且一更新了地址照样基本被盗链。
二、普通级 -- 隐藏音乐文件的真实地址,这个方法大家都想到过吧,:) 。制作方法是通过脚本运算或者加密码来给查找真实地址制造麻烦。就拿mp3播放来说吧,我所使用的方法是这样比如play.asp 是播放器页面,在服务器运算的时候放取得真实地址,把这个地址写入session[地址]中保存, play.asp根本不出现这是的资源地址,play.asp下载完成后立即会加载url.asp脚本文件,在url.asp中检测是否有session[地址]有就写如脚本,并且立即清除该值。没有就不作任何输出。这样处理在播放页效果比较好,但是在下载页就不这么好隐藏了,而且只要用户安装了讯雷软件,鼠标移动到播放器上真实地址力马就显示出来了。而且本人认为只要是能给客户端提供正常服务器的,基本上不可能做到隐藏。除非不提供服务。否则随便找个抓包软件一抓就出来了。
三、中量级 -- 用asp.net拦截httpHandlers,该方法和拦截IIS的ISAPI插件基本上是一个原理。作为资源下载站,根本不用隐藏真实地址,就算完全暴露在外,其他站长把地址放到他的站上点击就会失效。原理是:通过链接请求的来路判断是否为盗链。如果来路不符合要求则表示该请求为盗链的,马上终止就可以了。这种方式相对前面两种方法来说防盗技术已经跨越了一个质的飞跃过程了。效果非常好。现在使用这种方式防盗的软件非常多,比如最出名的免费软件re_writer等。但是美中不足的是:如果象54star.net 这样的音乐站,要提供在线试听功能,而经检测播放器请求的来路是空的,也就是说要提供在线试听服务器,必须把来路为空也视为合法。这样一来,盗链的链接通过工具下载或者点右键-》另存为的已经其他站的播放器直接链接也是合法的。没有完全达到防盗的效果。
四、重量级 -- 通过密匙验证,使用的原理和方法三很相识,一样是拦截IIS,但不同的是,拦截的不是来路,而是地址后面的一串参数---经过加密处理后的密匙。其他密匙的原理和现在的在线支付系统一样,在线支付系统后台都要设置一个密码,在你的网站上也要设置一个同样的密码,表单提交来往的过程中判断是否合法全靠它了。使用这种方法防盗链的加密防止通常是这样 密匙 = 加密函数(客户端IP + 密码). 最后生成的地址形如:http://down.54star.net:89/cd/js-bksyjx/02.mp3?5335aaf7dec19388b7bb799dd70482e,问号前面的时候真实地址,后面那串东西就是密匙,判断是否合法就是通过判断它是否正确了。想盗本站资源的难度就形如要去破解一个未知长度,而且随时可以更改的密码是一样的。这种方法可以说在几种防盗技术中可以勘称最完美的了。而且资源服务器和网站服务器可以分开拜访。如果要提供给友情站使用,只需要把密匙告诉他即可。
五、超重量级 -- 经管使用方法四已经几乎达到完美了,但是该防盗方法唯一美中不足的就是性能了。一般下载站都是使用HTTP协议提供下载,IIS的功能很强大,会ASP。NET的都知道其三层结构,其处理机制很庞大。所以,如果仅仅是把IIS当作下载资源服务器的话有些让IIS不堪重负了。象54star.net这个站就发现,只要下载的人稍微一多IIS占用资源非常高,而且IIS的可以并发的数量并不多,只要一超过一定数量,就会出现各种各样的问题。比如提示服务器太忙这种问题你也经常遇到吧。所以在这里推荐给你一个新出品的免费软件:思达防盗链下载专用服务器软件,下载地址是http://54star.net/downserver/,这个软件不仅使用方法四通过密匙的方式来防止盗链。更优秀的是它完全从IIS中脱离了出来,一心一意地处理文件的下载服务器。从下载速度、占用资源已经并发数量等参数来说它都是最优秀的免费软件。我朋友的音乐站自从使用了这套系统以后一下子稳定起来了。所以在这里向大家强烈地推荐使它。另外这个软件是.net1.1写的,所以只能在windows2000,windows2003或者装有.net framework1.1的操作系统上运行。文件非常小,只有54K、无需安装。