上班一大早就来写了,很多朋友惦记着这篇文章。不浪费时间了。。
这篇文章,主要思考下,防盗链的实现方式,以及具体实现的思考。
实现原理:
原理其实很简单,在文件被访问之前判断请求是否合法,如果不合法,就拦截掉,提示错误信息。
所以我在想,重点是怎么去判断,这个请求是不是合法的。
判断方式:
我粗略的想了想,想到两种关系方式。
一、判断请求的 来源页(referer) 是不是来自自己的域名。如果不是,就拦截掉。
二、使用 加密验证 的方式来判断,请求是不是合法。
我上午在园子里找了找,发现基本上都是第一种 来源页(referer) 方式。。这种方法是最简单的方法。
这种方法实现起来简单,你在网上会看到很多的“图床”采用这种方式,去防止外链。。
如果你的要求只是要防止外链的话,这种方法就够用了。。
但这种方式有一定的不足之处,因为 来源页(referer) 是可以伪造的。。
笔者用过一些“黑客浏览器”,是可以自定义每一个请求的 http header 。
由于 赞美诗网 是音乐试听下载网站,第一种方式明显不合适我。
我的需求,不光是防止外链,还要防止采集到地址而批量下载,或者说,我要限制只有正常浏览网站的用户才能访问我的文件。
所以,我必须使用第二种方式,使用加密验证的方式,来判断请求是不是合法。。
注:由于第一种方式,园子里有很多介绍,本文就不过多的介绍如何实现。
本文主要重点在第二种方式。结合实现的项目应用展开。。
--------------------------------------------------------------------------------------------
本文的目的,是还算比较详细的介绍怎么处理防盗链,注意:是基于asp.net的防盗链。。
不过实际上,是支持任何平台任何语言的。 主要介绍 加密验证 的实现。
上文介绍了两种判断方式,那我们来看看,具体怎么实现。
本文的重点是介绍第二种,加密验证方式,所以,第一种只是简单介绍,具体实现,各位可以到园子去找找,有很多。
一、判断 来源页(referer) 方式:
这种方式很简单了,大多WEB服务器都原生支持,不需要我们写一行代码,只要写几行配置文件就行了。
iis, nginx, apache 中只要配置urlrewrite规则就可以了。 (注:iis可能要另外安装rewrite组件)
asp.net 中,我们还可以使用 httpmodule 和 httpheader 来处理请求。
二、加密验证方式
这种方式稍微复杂一点,在生成文件地址的时候,生成一个 hash ,放到url中一起,然后在文件服务器,判断这个hash是否合法。
这样来判断,这个请求是不是合法请求。。这种方式需要我们自己来写一些代码实现。
当然,如果你够有钱,可以买商业程序,但是商业程序需要我们去调用接口,也比较麻烦的还花钱。。
鉴于程序员=民工)(我也是),所以我们就自己来来实现吧。。。
这种方式的重点,在于怎么生成 验证码(hash)
看看我们的需求:防外链,有效期限制(时间),防下载软件,限IP?
基于以上要求,生成的hash当中,必须要包含这些信息。
因为这个hash只需要用来验证,所以不需要还原成明文验证,我直接使用md5加密了。。
那我们要怎么组合这个hash来达到以上的要求呢? 看官先想想。。。。。。。。。
想好了没? 没? 是没想吧~~~~ 算了,我直接说吧。
防外链: 随便加点密就可以防外链了,随意换换加密内容。
但是生成的hash是谁都能用的,所以我们需要更多限制,把IP也加在加密内容中,这样就可以防止别人连接了。
时间限制: 把当前时间做些处理,放在加密内容当中,这要就可以设置有效期了。
防下载软件: 由于http请求中会携带 浏览器信息(Request.UserAgent)
而且不同的浏览器,不同的软件,根据系统环境和安装的程序,都各不相同。
所以,把这个信息放在加密的内容中,就可以防止不同浏览器或下载软件了。
基于以上条件,我的加密格式是这样:“{type}{id}{time}{agent}{ip}”
{type} 表示类型, 因为我站中,有多种类型,每种类型的hash我都要不一样。。 单独限制
{id} 表示标识, 通常我使用表中的Id字段,或是每个文件的唯一标识,(也可以使用url来算md5做标识)
{time} 时间标记, 用来限制hash的有效期。
{agent} http头, 浏览器或软件携带的http header..
{ip} IP地址, 这样,每个hash对应不同的IP,只有这个IP可以访问。也就是说,我得到的地址,发给你,你是访问不了的。
注:这个加密格式是可以随意设置的。可以加一些混淆的内容,比如:“a{type}b{id}c{time}d{agent}e{ip}ksksksksk”
这样保证你的格式和别人不一样,而这个hash是在服务端生成,所以,别人是没办法盗用的。
除非别人知道你的格式,否则是没办法破解的。。 建议你自己加一些混淆内容。。
汗~~~限制的好死~~~ 这样的话,基本上,只有正常浏览网站的用户,才能访问文件了。
所以,如果你只想防外链的话,用第一种判断方式吧。。。。。 此方式限制太高。。
具体做法:
在网站中,根据以上条件生成hash,携带在文件的url中,做为一个参数,
然后在文件服务器中使用 httpmodule 或 httpheader 来生成新的hash和传过来的hash对比。
如果hash不相等,就是无效请求。。 (仅限Asp.Net)
如果其它语言要使用的话,也是可以,只是麻烦一点。。 就是:所有的文件请求,都通过程序转一次。
比如php,原本请求文件 /down/aa.mp3 ,现在要使用php程序去发送文件。 /down.php?file=/down/aa.mp3
用php判断hash, 再程序读文件发送。。。。。 其它语言也一样。。。
目前 赞美诗网 就是通过程序发送文件的方式。
这篇到这,接下来,会讲具体的实现,以也项目的实践。
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/cshapo/csharpjs/20100108/188529.html