今天在书上偶然看到了如何实现防盗链的问题,到网上查看了一下盗链主要是其他的一些网站引用本站图片或者下载链接。如果被引用的站比较小这样外站盗链带来的“无作用”流量就给站长带来了压力了(流量也是要钱滴)。对于防盗链可以从两个方面来防,一个是服务器,一个是程序里面判断。各个服务器的判断不一样,iis需要安装特定的防盗链软件。我们今天主要讨论的是程序里实现防盗链。

原理解释

网上现在比较流行的是使用handler来实现防盗链。具体的意思如下:专门新建一个针对某种文件请求的处理类(继承于IHttpHandler)并在web.config里面配置好所有的该文件请求都指向该类。然后在类里面判断该请求的前一次请求是不是存在并且指向我们站的域名,如果存在则认为不是盗链,返回真实的文件。否则返回error图片。

让我们设想一下如果现在另外一个网站引用了我们站的图片,并应用到了一篇文章当中。现在有个人请求那个网站的文章,用户的request是向他们的服务器发出的,他们站的服务器返回html让浏览器解析。浏览器解析到我们的图片地址时他会向我们站发起这个图片的请求。因为我们程序的设置这个请求会被转发到我们特定的类做处理,程序判断这个request前面的请求是不是为空(显然它只请求了我们的图片其他没有请求,所以当然没有前面的请求),为空则返回error图片。理解了上面的过程就容易知道为什么请求我们站的那个网页时里面的图片则正确显示了,用户显示request了那个页面,所以里面当然有前面访问的记录。当浏览器解析我们站的图片时候就正确返回了。不知道大家懂了没呢?

代码实现

首先创建一个类继承于IHttpHandler,我这里就叫做ForbiddenInvaliteDownload类了:

代码public bool IsReusable{get { return true; }}public void ProcessRequest(HttpContext context){if (null != context.Request.UrlReferrer){context.Response.Expires = 0;context.Response.Clear();context.Response.ContentType = "image/jpg";context.Response.WriteFile(context.Request.PhysicalPath);  context.Response.End();}else{context.Response.Expires = 0;context.Response.Clear();context.Response.ContentType = "text/html";context.Response.Write("盗链");context.Response.End();}}

代码很少,大家一看就明白了。就是用context.Request.UrlReferrer这个判断一下前面一个请求是否存在,存在则认为是合法的,否则不合法。

仅仅是这个类还不能将所有的jpg请求转发过来,我们需要配置一下webconfig,在System.Web下配置:

代码<httpHandlers><add verb="*" path="*.jpg" type="Namespace.ForbiddenInvaliteDownload,Namespace"/></httpHandlers>

这里还要提到的是IIS默认是不会为JPG文件发送请求的,而是直接获取。所以我们还要在iis里面配置一下让所有的jpg请求都转发到我们的那个处理程序,而不是iis默认的直接获得。配置如图:

至此,你的网站已经可以防止jpg文件被盗了。当然,其他的zip等等文件同样也可以实现,您可以处理一个通用类,根据请求的后缀判断是什么类型从而进行操作。下面是效果图:

结束了吗

上面的方式并不能防止迅雷等下载软件的下载,在迅雷里面输入这些地址照样可以下载。如果别的站引用了你的某个.zip的文件链接,这样还是可以直接下载到的。那该如何解决呢?我目前想到的就是加入session验证。

如果用户访问了你的下载页面则在load里面设置session[“visited”]=”true”,然后在下载里面增加一个session验证,代码如下(注意,需要继承

System.Web.SessionState.IRequiresSessionState才能使用session):
代码if (null != context.Request.UrlReferrer && context.Session["visited"] == "true"){context.Response.Expires = 0;context.Response.Clear();context.Response.ContentType = "image/jpg";context.Response.WriteFile(context.Request.PhysicalPath);context.Response.End();}else{context.Response.Expires = 0;context.Response.Clear();context.Response.ContentType = "image/jpg";context.Response.WriteFile(context.Request.PhysicalApplicationPath + "Images/2.jpg");context.Response.End();}

这样我们调试的时候调用迅雷下载这个图片就可以发现session里面是没有值的,当然就下载error图片了。

如果您还有其他的方法,欢迎和我交流! ^_^

Asp.net防止盗链相关推荐

  1. ASP.NET2.0雷霆之怒盗链者的祝福【月儿原创】

    ASP.NET2.0雷霆之怒盗链者的祝福 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.3.28 所谓盗链就是指其他网站把我们 ...

  2. 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  3. Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作

    本文告诉你如何在ASP.NET MVC中实现一个自定义RouteHandler来防止其他人盗链你的图片. 首先,我们来回顾一下当一个请求发往ASP.net MVC站点时的情景,IIS收到请求并将请求转 ...

  4. Asp.Net Core 通过中间件防止图片盗链

    一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...

  5. ASP NET2 0雷霆之怒盗链者的祝福【月儿原创】

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! ASP. ...

  6. ASP.NET2.0雷霆之怒盗链者的祝福

     所谓盗链就是指其他网站把我们站点的文件链接帖到他们站上,这样白白占用我们的带宽.访问对于网站盗链行为,是非常不道德的.要实现防盗链,我们就得在IIS处理URL时拦截. 效果图: 未加防盗链之前: ...

  7. ASP.NET_阻止图片盗链

    什么是图片盗链   一般的浏览现象,其中最重要的一点就是一个完整的页面并不是一次全部传送到客户端的.如果你请求的是一个带有许多图片和其他信息的页面,那么最先的一个HTTP请求被传送回来的是这个页面的文 ...

  8. HttpHandler应用之 防止图片盗链

    httpHandler 是特别类的一种,可以处理对特定类型文件的请求.实际上甚至可以通过创建自己的处理器来处理对.aspx 页面的请求,将整个页面的处理系统换掉.下面我们就用HttpHandler 来 ...

  9. 请求之前~HttpHandler实现媒体文件和图像文件的盗链

    小知识: 一个WEB的请求从客户端发到到服务端接收,处理并返回给客户端,它的流程是这样的(以aspx页面为例): HttpRequest-->inetinfo.exe-->ASPNET_I ...

  10. java 防止盗链AntiLeech

    防止盗链的方法有很多 这里采用如下方法, 方法:判断引用地址 这个方法是最早及最常见的方法.所谓判断引用地址,就是判断浏览器请求时HTTP头的Referer字段的值,这个值在asp.net里面可以用 ...

最新文章

  1. 聊聊springboot elasticsearch healthIndicator
  2. 来试试读论文的新神器!AMiner发布“论文背景文献”一键生成工具,帮你搞清一篇论文的“来龙去脉”...
  3. LinkedBlockingQueue源码
  4. 电大计算机网考上机操作题,电大计算机上机考试模拟题及答案 (1)
  5. Python得到n个从start到end的不重复随机数(set实现)
  6. CentOS 7 - 创建新用户
  7. 鲍威尔法源程序码matlab,鲍威尔算法matlab程序.doc
  8. 面向接口编程(面向协议编程)
  9. 一起学爬虫(Python) — 04
  10. 什么是个人热点?安卓手机怎么开启个人热点?
  11. Vim常用操作,normal模式、insert模式和visual模式
  12. 产生按指数分布的随机数----摘自csdn
  13. web浏览器中的javascript
  14. flex-shrink 解决实际问题(flex-shrink:0避免图片被压扁)
  15. 实现微信向多好友定时发送信息
  16. java测试一个泰勒级数,数学原理-高等数学复习笔记 ——1.1 泰勒公式 泰勒展开式...
  17. 漫步数理统计十四——重要的不等式
  18. 【C++】Heather银行对顾客排队等待的时间进行估测问题 《C++ Primer Plus》12.7 队列模拟 学习笔记
  19. 全国高校计算机能力挑战赛C语言编程题 第四题
  20. 最新最全论文合集——数据库与人工智能

热门文章

  1. spark学习——(二)spark基础环境配置-linux(1)
  2. linux代码诊断有没有link,Linux下判断网线是否插入的代码
  3. nv21转jpg c语言,Yuv420转Jpeg(C语言实现)
  4. php 框架测试,PHP测试框架PHPUnit组织测试操作示例
  5. 关于命令行启动MySQL服务的相关问题
  6. 华为路由器第三方插件_为什么路由器不开 SSH 就等于失去了很多乐趣?
  7. 找出数组中第二大的值
  8. 华为路由器配置文件备份与恢复
  9. (转)iOS-蓝牙学习资源博文收集
  10. Chapter 1 First Sight——13