ASP.NET 防盗链的实现[HttpHandler]

本文转载:http://www.cnblogs.com/eflylab/archive/2008/06/16/1223373.htmlhtml

有时咱们须要防止其余网站直接引用咱们系统中的图片,或下载文件连接。须要禁止盗链!在ASP.NET中能够方便的实现该功能!
作一个简单的盗链图片的示例,以下。新创建一个WebApplcation。新创建一个images文件夹,里面二张jpg图片,一张logo.jpg正常图片,一张用于提示非法盗链的图片Error.jpg图片。
页面default.aspx页面很简单。就一个图片以下web

< form  id ="form1"  runat ="server" >
    
< div >
    
< img  src ="images/logo.jpg"   />
    
</ div >
    
</ form >

这里使用HttpHandler来处理盗链问题
新创建一个 通常处理程序 Handler1.ashx.代码及注释以下api

public   void  ProcessRequest(HttpContext context)
        
{
            
//判断是不是本地网站引用图片,若是是则返回正确的图片
            if (context.Request.UrlReferrer.Host == "localhost")
            
{
                
//设置客户端缓冲时间过时时间为0,即当即过时
                context.Response.Expires = 0;
                
//清空服务器端为此会话开启的输出缓存
                context.Response.Clear();
                
//设置输出文件类型
                context.Response.ContentType = "image/jpg";
                
//将请求文件写入到输出缓存中
                context.Response.WriteFile(context.Request.PhysicalPath);
                
//将输出缓存中的信息传送到客户端
                context.Response.End();
            }

            
//若是不是本地引用,则是盗链本站图片
            else
            
{
                
//设置客户端缓冲时间过时时间为0,即当即过时
                context.Response.Expires = 0;
                
//清空服务器端为此会话开启的输出缓存
                context.Response.Clear();
                
//设置输出文件类型
                context.Response.ContentType = "image/jpg";
                
//将请求文件写入到输出缓存中
                context.Response.WriteFile(context.Request.PhysicalApplicationPath + "images/error.jpg");
                
//将输出缓存中的信息传送到客户端
                context.Response.End();
            }

        }

        
// 该属性表示HTTP请求是否可使用当前处理
         public   bool  IsReusable
        
{
            
get
            
{
                
return true;
            }

        }

该文件用于接管HTTP请求JPG格式的图片。若是是从主机localhost访问的,则容许。不然显示错误的图片!
到这里该文件尚未效果,须要在Web.config文件进行配置HttpHandler节点 以下缓存

< httpHandlers >
        
< add  verb ="*"  path =".jpg"  type ="MyNamespace.Handler,MyNamespace" />
      
</ httpHandlers >

来测试下 启动

图片正常显示。若是将访问地址改成 http://127.0.0.1:2136/Default.aspx 效果以下
 

但此时将该项目发布到IIS中,运行

没有出现但愿效果,这是由于经过IIS请求 并无将.JPG的格式使用.NET引擎进行解释,而是如静态页面HTML同样直接返回给了用户,这时咱们但愿用户请求.JPG时也能像.ASPX同样便可解决这个问题,打开IIS。选择该网站
右键属性

点击配置

点击添加

添加.jpg后缀的请求。交给aspnet_isapi.dll处理,这样咱们本身写的通常处理程序 Handler1.ashx就有效果了,
也许多心的朋友会问,咱们不是在web.config中写了这样一个配置的吗?为何没有做用呢。这是因为IIS对.jpg后缀的请求直接就加载图片返回了,这里并不会使用aspnet_isapi.dll处理,因此也就更加到达不了Handler1.ashx这一步,当咱们在IIS中配置后,便可实现!

根据相同的原理也能够实现 下载文件的防盗链~原理雷同~ 

拓展一下,使用该法还能够解决站内新闻资讯被人使用蜘蛛程序抓取的问题!

不过此法并不是没有缺点,首要的就是会下降系统的性能!这个要看我的权衡了!服务器

相关文章
相关标签/搜索