如果报价站比较小,从站外盗链带来的“无用”流量会给站长带来压力(流量也需要钱)。防盗链可以从两个方面来预防,一是服务器,二是程序中的判断。不同的服务器有不同的判断,iis需要安装特定的防盗链软件。今天我们主要讨论防盗链在方案中的实现。说明原理在网上用handler实现防盗链很流行。具体含义如下:创建一个新的文件请求处理类(继承自IHttpHandler),并在web.config中配置所有的文件请求都指向这个类。然后在课堂上判断这个请求的前一个请求是否存在,并指向我们站的域名。如果存在,就认为不是偷链,还真文件。否则,将返回错误图片。让我们想象一下,如果另一个网站现在引用我们站的图片,并将它们应用到一篇文章中。现在,有人向那个网站请求文章。用户的请求被发送到他们的服务器,他们所在的服务器返回html供浏览器解析。当浏览器解析到我们的图片地址时,他会向我们的站点发送对这张图片的请求。因为我们程序设置的请求会被转发到我们特定的类进行处理,程序会判断这个请求之前的请求是否为空(很明显,它只请求了我们的图片,但是没有之前的请求,所以当然没有之前的请求),如果为空,则会返回错误图片。了解了上面的过程,就很容易知道为什么我们所站的网页中的图片在我们请求的时候是正确显示的,而用户显示的是请求的页面,所以里面当然有之前访问的记录。当浏览器解析我们站的图片时,它会正确返回。不知道大家是否理解。代码的实现首先创建一个继承自IHttpHandler的类,这里我就称之为ForbiddenInvaliteDownload类:代码副本的代码如下: public bool是可重用的{ get { return true} } public void process request(HttpContext上下文){ if (null!=上下文。request . urlrerer){ context。响应。过期=0;语境。响应. Clear();语境。响应. ContentType=' image/jpg ';语境。响应。WriteFile(上下文。request . PhysicalPath);语境。响应. End();} else { context。响应。过期=0;语境。响应. Clear();语境。响应. ContentType=' text/html ';语境。回应.写('连锁盗窃');语境。响应. End();}}代码很少,大家一目了然。也就是使用上下文。Request . UrlReferrer判断前一个请求是否存在。如果存在,就会被认为是合法的,否则就是非法的。只有这个类不能转发所有的jpg请求,所以我们需要配置webconfig。在系统下。Web配置:代码复制代码如下: httphandlers add verb=' * ' path=' * '。JPG ' type=' namespace . forbiddinenvaliteddownload,namespace'//httphandlers这里还提到,IIS默认情况下不会发送对JPG文件的请求,而是直接获取它们。因此,我们需要将iis中的所有jpg请求配置为转发给我们的处理程序,而不是默认情况下在iis中直接获取它们。配置图:
此时,您的网站已经能够防止jpg文件被盗。当然,也可以实现其他zip文件。可以处理一个普通类,根据请求的后缀判断是什么类型。以下是渲染图:
结束了吗?以上方法无法阻止下载迅雷等软件。你仍然可以在迅雷下载这些地址。如果其他电台提到你的。zip文件链接,它仍然可以直接下载。那么如何解决呢?目前我想到增加会话认证。如果用户访问您的下载页面,请在加载中设置会话[“已访问”]=“真”,然后在下载中添加会话验证。代码如下(注意,您需要继承系统。web . session state . irequiesssession state使用会话):代码复制如下: if (null!=上下文。Request.UrlReferrer上下文。会话[“已访问”]==“真”){上下文。响应。过期=0;语境。响应. Clear();语境。响应. ContentType=' image/jpg ';语境。响应。WriteFile(上下文。request . PhysicalPath);语境。响应. End();} else { context。响应。过期=0;语境。响应. Clear();语境。响应. ContentType=' image/jpg ';语境。响应。WriteFile(上下文。request . physicalaapplicationpath ' Images/2 . jpg ');语境。响应. End();}这样,我们在调试的时候,可以调用迅雷下载这个图片,发现会话中没有任何值,所以当然会下载错误图片。