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

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

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

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

这里使用HttpHandler来处理盗链问题 新建立一个 一般处理程序 Handler1.ashx.代码及注释如下

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中配置后,即可实现! 根据相同的原理也可以实现 下载文件的防盗链~原理雷同~ 拓展一下,使用该法还可以解决站内新闻资讯被人使用蜘蛛程序抓取的问题! 不过此法并非没有缺点,首要的就是会降低系统的性能!这个要看个人权衡了!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

Django项目实战之用户头像上传与访问

1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> <meta char...

4847
来自专栏JetpropelledSnake

Web前端学习笔记之前端跨域知识总结

相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的。但跨域方法的多种多样实在让人目不暇接。老规矩,碰到这种情况,就只能自己总结一篇博客,...

783
来自专栏程序员同行者

ssh升级

2051
来自专栏Angular&服务

sublime text 安装插件

1054
来自专栏Jerry的SAP技术分享

使用代码获得Netweaver里某个software component和C4C的版本

有同事问如何通过代码的方式获得Netweaver里某个Software component的版本信息,以及Cloud for Customer(C4C)的版本信...

2542
来自专栏禅林阆苑

Webpack学习总结 【原创】

Webpack学习总结 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/...

43013
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

React Native应用部署/热更新-CodePush最新集成总结(新)

React Native应用部署/热更新-CodePush最新集成总结(新) ---- 更新说明: 此次博文更新适配了最新版的CodePush v1.17....

7236
来自专栏csxiaoyao

Webpack学习总结

4746
来自专栏听雨堂

fckeditor上传问题的解决

一、上传时报Invalid Request,问题解决在此: fckeditor编辑器上传文件出现invalid Request问题解决! FCKConfig....

2095
来自专栏bdcn

Flask学习笔记-在Bootstrap框架下Web表单WTF的使用 顶

表单的处理一般都比较繁琐和枯燥,如果想简单的使用表单就可以使用Flask-WTF插件,同时我们把WTF融合到Bootstrap中这样样式的问题都自动解决了,本篇...

3774

扫码关注云+社区

领取腾讯云代金券