网站的防盗链与反盗链的那点事

时间:2024-03-12 07:51:41

      最近帮朋友做一数据采集器,将A网站上的数据自动采集到B网站上,在做的过程中遇到网站的盗链问题。很不幸的出现下列的画面:

      盗链

       很不幸我们采集数据的网站设置了防盗链机制,遇到问题就要解决,如下,就细细的探讨一下我对这个东东的理解吧:

      一  什么是网站防盗链与反盗链:

          首先说一下什么是网站的防盗链:防盗链是一种机制,也可以说是一种技术.目的就是防止自己网站上的东西(如图片,文件 etc。)被其他用户采用其他的技术手段来访问或者下载,这种机制在google,sina,天涯上很普遍,再说为什么不让你盗链呢,既然不让盗链肯定涉及到一些利益的问题,呵呵,这是我猜想。因为盗链的话就会分散主网站的流量(^_^流量可是很多网站的钱途啊)。那么它是如何实现的呢,或者是怎么才能做到自己网站上的东西不被别人盗链呢,要说这个就有必要说说他的原理。我们知道在网络上我们每次发送一个请求的时候都会生成一个http请求,然后服务器会对这个http请求进行解析,那么一个http请求中有什么标志或者说是什么作用来实现防止盗链的作用呢,下面我们看一个简单的http请求(http的请求和相应后头我们再说),看看再http请求中有什么是可以用来作为盗链的标志的呢:

图片

上图是我们在请求www.baidu.com的时候在加载显示在百度首页上的图片时发生的http请求和响应,

我们看图片中的两个红色的标记处,第一行是请求的图片的地址,第二行是我们今天要说的Referer :请求图片来源,这里显示的是www.baidu.com,说明这个图片是在百度的图片服务器上下载下来的。那么这里问题就得到解决了,既然可以得到这个图片的来源Referer,服务器就可以通过判断Referer中的值是不是自己网站服务器的域名来判断这个请求是不是别人盗链的,也就是请求没有在自己的网站上发出。利用referer来防止盗链的技术原理就是这样的,我们在请求的时候浏览器发送到服务器端的时候就会在request中有这个Referer,当然也有人说,我在浏览器输入框中手动的输入图片的下载地址也可以下载啊,是这样的,那这是为什么呢?我只能说你遇到的是大部分的网站,但是也有一些防盗链机制很严格的即使你自己手动的在浏览器输入框中输入也不能看到图片,问题就是对大部分的网站在手动输入请求地址的时候Referer是空的(null),服务器就会认为你是手动的在下载图片,这样服务器是不会去拦截的,你很幸运的就可以看到那个妹妹的图片了。

         上面说的只是防盗链机制中的一种:通过http请求中的Referer来判断,

          还有如下几种方式也可以实现:1 nginx在处理每一个静态的页面请求的时候也可以拦截处理,2 通过用户是否登录来判断(这里主要是session在起作用)。。。可能还有其他的方式,待我研究研究在和大家交流。

2 什么是反盗链:

        既然有防盗链的机制,那么对于很多的有哪些需求的淫来说我得可以搞到我需要的东东啊(当然首先声明啊,这是很不道德的,我们只是就技术而言来讨论这个问题,很不赞成大家去这样做)。这就需要去反盗链,在这里我只针对利用http请求request中的referer的机制来分析一下反盗链机制,对于利用mginx和用户登录的方式暂时不是很容易实现反盗链。既然在referer中是利用referer中的值来判断请求是否是盗链的,那么我们就可以利用相应的技术手段来改变这个referer的值来实现。

        今天就写到这里吧,要去开会了,反盗链的问题我们下回再细说。。。。。。

        好了接着咱的反盗链之路:

        上面说过既然有防盗链那么就会有反盗链的技术去破解这个问题,下面就说说如何来解决通过referer来实现的防盗链机制:

         对于不同语言开发者而言去操作这个http中的request的referer这个值得方式是不一样的,就比如说servlet来处理这个referer的话就是先得到这个http请求request中的referer,通过一个拦截器的方式去拦截这个请求,然后对这个referer值进行修改,那么如何修改呢,肯定是修改为盗链网站的域名。至于这个拦截器怎么去编写大家应该都会,.net在操作这个referer值的时候也是一样的,或者是用一个拦截器去请求,或者是让请求指向特定的请求地址,在特定的请求地址中对这个referer进行包装。比如我想盗链www.aaa.com上的一个图片,这个图片的请求地址是www.aaa.com/image/1,jpg。那么在请求的时候我们可以让请求指向www.ourserver.com/handleRequest.asp?url=www.aaa.com/image/1,jpg中,在这个处理器中对referer进行重新的包装,怎么包装呢,就是讲referer的值制定为www.aaa.com。这样www.aaa.com在接到图片请求地址的时候就会去判断请求中的referer值,这时因为我们对referer值已经进行了重新的包装,就可以通过www.aaa.com的校验。

      甚至其他的几种方式:如通过nginx,和登录session的方式的反盗链比较麻烦,后续学习学习再和大家探讨吧。

      最后声明一点:我们只是在就技术论技术,并不提倡大家去盗链别人的网站,因为这是不道德的同时也是不合法的。大家在学习的过程中重要的是技术本身,而不是技术所进行的行为,与大家共勉!!!