`
lovnet
  • 浏览: 6915024 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载 (转)

阅读更多

转自:http://blog.csdn.net/zhoufoxcn/archive/2008/01/11/2036995.aspx
昨天粗略讲了一下IHttpHandler接口的作用和动态给图片添加水印的处理,如果对这些不太清除的朋友,建议看看这篇《IHttpHandler的妙用(1):给图片添加水印》:http://blog.csdn.net/zhoufoxcn/archive/2008/01/10/2033530.aspx

昨天也提到了IHttpHandler接口主要有一个IsReusable属性和一个ProcessRequest方法,利用这个方法我们可以处理很多事情的,昨天我们利用了这个方法给图片动态添加了水印,今天我再来展示另一种用法。

大家查看一个msdn,可以看到它的声明如下:

VisualBasic(声明)
SubProcessRequest(_
contextAsHttpContext_
)

VisualBasic(用法)
DiminstanceAsIHttpHandler
DimcontextAsHttpContext

instance.ProcessRequest(context)

C#
voidProcessRequest(
HttpContextcontext
)

注意这个HttpContext对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。

有了它我们就方便多了,因为我们的下载资源一般都会有一个下载介绍(假设为details.aspx?id=***),用户查看介绍之后,如果愿意下载,就会点击下载链接,这个链接也是一个页面(假设为download.aspx?id=***),我们就可以得出结论,只要是用户通过我们的网站下载这些资源,那么在下载资源之前访问那个页面(简称前导页,下同)一定是details.aspx,因此我们就可以得出结论只要是下载之前的前导页不是details.aspx这个页面,那个这个下载请求一定是别的网站盗链(其实还可以放宽一点,在下载之前的前导页一定是本站的页面,也还可以要求更紧一点,下载之前访问的页面的id值一定要与下载的id值一致,这就看大家的实际要求了)!

有了这个推论之后,我们就可以动手写代码了:

usingSystem;
usingSystem.IO;
usingSystem.Web;

///<summary>
///说明:DownloadHandler是一个防盗链的类,它可以防止本站资源被别的网站盗用
///作者:周公
///日期:2008-1-11
///首发地址:http://blog.csdn.net/zhoufoxcn
///</summary>
publicclassDownloadHandler:IHttpHandler
{
publicDownloadHandler()
{
//
//TODO:在此处添加构造函数逻辑
//
}

#regionIHttpHandler成员
///<summary>
///指示IHttpHandler实例是否可再次使用
///</summary>
publicboolIsReusable
{
get{returntrue;}
}
///<summary>
///处理请求的方法
///</summary>
///<paramname="context">它提供对用于为HTTP请求提供服务的内部服务器对象(如Request、Response、Session和Server)的引用。</param>
publicvoidProcessRequest(HttpContextcontext)
{
UrireferrerUri
=context.Request.UrlReferrer;//获取下载之前访问的那个页面的uri
UricurrentUri=context.Request.Url;
if(referrerUri==null)//没有前导页,直接访问下载页
{
//输出提示,可以根据自身要求完善此处代码
context.Response.Write("请不要盗链本站资源,请从首页访问。<ahref='index.aspx'>首页</a>");
return;
}
#region判断前导页是否位于本站可以用此段代码
//if(referrerUri.Host==currentUri.Host)//前导页和当前请求页位于同一个主机
//{
////用户是通过正常路径访问的,向用户提供下载文件
////实际情况是根据id从数据库找到文件的物理路径,然后输出
////为了简单代码,仅仅演示流程,这里我直接输出了文件
////周公注。2008-1-11
////获取请求的物理文件路径
//WriteFile(context);
//}
//else
//{
////输出提示,可以根据自身要求完善此处代码
//context.Response.Write("请不要盗链本站资源,请从首页访问。<ahref='index.aspx'>首页</a>");
//}
#endregion
#region判断前导页是否是我们的介绍页面
stringreferrerPage=referrerUri.LocalPath.Substring(referrerUri.LocalPath.LastIndexOf('/')+1);
if(referrerPage=="Details.aspx")//如果前导页是我们的介绍页面
{
//用户是通过正常路径访问的,向用户提供下载文件
//实际情况是根据id从数据库找到文件的物理路径,然后输出
//为了简单代码,仅仅演示流程,这里我直接输出了文件
//周公注。2008-1-11
//获取请求的物理文件路径
WriteFile(context);
}
else
{
//输出提示,可以根据自身要求完善此处代码
context.Response.Write("请不要盗链本站资源,请从首页访问。<ahref='index.aspx'>首页</a>");
}
#endregion

}

privatevoidWriteFile(HttpContextcontext)
{
//用户是通过正常路径访问的,向用户提供下载文件
//实际情况是根据id从数据库找到文件的物理路径,然后输出
//为了简单代码,仅仅演示流程,这里我直接输出了文件
//周公注。2008-1-11
//获取请求的物理文件路径
stringpath=context.Request.PhysicalPath;
//注意这里rar文件的ContentType是application/octet-stream
//不同格式文件的contentType有可能不同
context.Response.ContentType="application/octet-stream";
context.Response.WriteFile(path);
}

#endregion
}

对web.config的配置:

<?xmlversion="1.0"?>
<!--
注意:除了手动编辑此文件以外,您还可以使用
Web管理工具来配置应用程序的设置。可以使用VisualStudio中的
“网站”->“Asp.Net配置”选项。
设置和注释的完整列表在
machine.config.comments中,该文件通常位于
WindowsMicrosoft.NetFrameworkv2.xConfig中
-->
<configuration>
<appSettings>
<!--添加到图片上的水印文字-->
<addkey="WaterMark"value="http://blog.csdn.net/zhoufoxcn"/>
<!--水印文字的字体大小-->
<addkey="Font-Size"value="72"/>
</appSettings>
<connectionStrings/>
<system.web>
<!--
设置compilationdebug="true"将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为true。
-->
<compilationdebug="true"/>
<!--
通过<authentication>节可以配置ASP.NET使用的
安全身份验证模式,
以标识传入的用户。
-->
<authenticationmode="Windows"/>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过<customErrors>节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的html错误页
以代替错误堆栈跟踪。

<customErrorsmode="RemoteOnly"defaultRedirect="GenericErrorPage.htm">
<errorstatusCode="403"redirect="NoAccess.htm"/>
<errorstatusCode="404"redirect="FileNotFound.htm"/>
</customErrors>
-->
<httpHandlers>
<!--只处理UploadImages目录下的jpg文件,别的目录下的图片不处理-->
<addpath="UploadImages/*.jpg"verb="*"type="ImageHandler"/>
<!--所有的对zip、rar、iso文件的请求都由DownloadHandler处理-->
<addpath="*.zip"verb="*"type="DownloadHandler"/>
<addpath="*.rar"verb="*"type="DownloadHandler"/>
<addpath="*.iso"verb="*"type="DownloadHandler"/>
</httpHandlers>
</system.web>
</configuration>

前导页(Details.aspx):

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Details.aspx.cs"Inherits="Details"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>无标题页</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<ahref="Download.aspx?id=1">下载</a>
</div>
</form>
</body>
</html>

下载页没有什么html代码,主要是后台代码。下载页后台代码(Download.aspx.cs):

usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;

publicpartialclassDownload:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!Page.IsPostBack)
{
CheckUser();
//实际情况是根据id从数据库找到文件的物理路径,然后输出
//为了简单代码,仅仅演示流程,这里我直接输出了文件
//周公注。2008-1-11
//首发地址:http://blog.csdn.net/zhoufoxcn
Response.Redirect("download/demo.rar");//这里就会交给DownloadHanddler处理了
}
}
//检查用户登录等信息
privatevoidCheckUser()
{
//仅仅演示,具体代码根据具体要求编写
//比如用户没有登录如何处理,用户没有下载权限如何处理等
return;
}
}

正常流程截图:
(一)先打开介绍页面:

(二)点击下载链接进入下载页面:

此时出现文件保存对话框,情况正常。

再看盗链情况(非正常情况):
(一)打开首页(非前导页,跳过这一步也没有关系)

(二)直接访问下载页面或者直接访问下载文件的实际url地址:

此时出现了我们自定义的错误提示,甚至地址栏上都出现了该文件的物理地址,可是就是没有办法下载,此时就算是利用迅雷等下载软件,下载到的也是一个无效的文件,如图:

这样就达到我们的目地了,不是通过正常途径来下载是没有办法下载到他需要的文件的。

顺便说一下,写作本文时我是边编写代码边测试的(本博客原创的代码都是如此,测试通过之后方才发表,所以一般不会有什么问题,如果你学习的过程中发现有任何错误,请仔细检查你的代码,因为各人本地环境不同,出错原因各异,恕本人不一一指出你代码的错误之处)。

分享到:
评论

相关推荐

    ASP.NET 图片防盗链示例

    ASP.NET 图片防盗链示例是一个实用的编程实践,它主要针对网站的图像资源保护问题。在互联网上,图片被盗用是一种常见的现象,这不仅侵犯了原创者的权益,也可能对网站的流量造成损失。因此,实施图片防盗链技术是...

    C#防盗链实现入门级别

    防盗链,全称“防盗取链接”,是指网站为了防止自己的服务器资源(如图片、视频等)被其他网站未经许可地引用,通过技术手段限制只有自己的网页可以显示这些资源。在C#中,我们通常会通过HTTP处理器(HttpHandler)...

    httpHandler实战应用:RSS-图片防盗链接-图片验证码

    图片防盗链是为了防止其他网站直接引用你的图片资源,这样可以避免带宽被滥用,同时保护了原创内容的权益。HTTPHandler在此处的角色是检查HTTP请求的来源,如果发现请求的源地址不是预期的站点,那么可以拒绝服务...

    C#防盗链系统 httpHandlers

    在IT行业中,防盗链系统是一种常见的安全措施,用于防止他人盗用网站的资源,比如图片、视频或音频等。在本案例中,我们将探讨如何使用C#编程语言和httpHandlers来构建一个这样的系统。C#是微软开发的一种面向对象的...

    asp.net中利用ashx实现图片防盗链

    在ASP.NET中,实现图片防盗链是保护网站资源、防止他人网站随意调用自身服务器上的图片资源、节省带宽及服务器资源的一种常见策略。本文将详细介绍如何通过ashx(Application Handler)来实现这一功能。 ### ashx ...

    IHttpHandler介绍

    在实现图片防盗链的过程中,可以通过创建一个实现了`IHttpHandler`接口的类来检查请求来源是否合法。如果来源非法,则返回错误信息或空图像;如果合法,则正常返回图片资源。 ```csharp public class ImageHandler ...

    C# ASP.NET 模块 - 防盗链模块

    在Web开发中,防盗链(Anti-Linking)技术是一个关键的安全措施,它防止恶意网站未经许可引用或显示您的服务器上的资源,如图片、视频等。本教程将深入讲解如何在C# ASP.NET环境中实现一个防盗链模块。 首先,让...

    ASP.NET实现图片防盗链功能

    ASP.NET 实现图片防盗链功能是一项重要的网络安全措施,旨在防止他人未经许可地引用或嵌入网站上的图片资源,从而节省带宽、保护版权并提升用户体验。以下是一个详细的步骤指南,教你如何在 ASP.NET 中实现这一功能...

    防盗链模块,(HttpHandler+Apache技术)

    在IT行业中,防盗链技术是网络服务器为了保护其资源不被未经授权的第三方网站或用户盗用而采取的一种安全措施。防盗链模块的实现通常涉及到多种技术,如HTTP头部检查、Referer验证、IP黑白名单、Cookie验证等。在这...

    有效防止网页防盗链ASP2.0

    通常情况下,防盗链机制会检查请求来源是否合法,只有来自授权域的请求才会被允许访问资源。 #### ASP.NET 2.0中的防盗链实现 在ASP.NET 2.0框架下,可以通过自定义HTTP Handler来实现防盗链功能。下面是一段示例...

    asp.net中利用ashx实现图片防盗链代码

    在当前网络环境下,图片防盗链是一个非常重要的网站安全与资源保护措施。图片防盗链指的是防止其他网站直接通过URL地址盗用自己网站上的图片资源,从而节省带宽和流量,保护图片资源不被滥用。在***中,可以利用ASHX...

    asp.net HttpHandler实现图片防盗链

    在这个特定的例子中,我们利用HttpHandler来实现图片防盗链功能,防止其他网站未经许可引用我们的图片资源,从而减少带宽的消耗。 首先,我们需要创建一个名为`CustomHandler.cs`的文件,并在其中定义一个名为`...

    asp.net中利用ashx实现图片防盗链的原理分析

    防盗链是指对网站中的图片或其他资源提供一种保护机制,防止资源被其他网站非法引用,避免造成带宽和服务器资源的浪费,同时维护了网站内容的知识产权。 在HTTP协议中,请求资源的客户端会在HTTP头中包含一个...

    asp.net下结合HttpHandler实现图片防盗链

    ### ASP.NET 下结合 HttpHandler 实现图片防盗链 在 Web 开发中,图片防盗链是一项重要的功能,可以有效防止...通过上述方法,可以在 ASP.NET 应用中轻松实现图片防盗链功能,既保护了自己的资源,又提升了用户体验。

    ASP.NET 图片防盗链的实现原理分析

    ASP.NET 图片防盗链是一种防止他人未经许可在自己的网站上展示你的服务器上的图片的技术。它主要是通过对HTTP请求进行处理,检查请求来源(即`UrlReferrer`头)来判断是否允许显示图片。以下是对实现原理的详细解释...

    HttpHandler防图片盗链

    此外,还可以考虑更高级的防盗链策略,如设置IP黑名单,限制访问频率,或者使用更安全的Token验证机制,以增强图片资源的保护力度。 总结起来,"HttpHandler防图片盗链"是一种利用ASP.NET HttpHandler和Web.config...

    ASP.NET 图片加水印防盗链实现代码

    ASP.NET 图片加水印防盗链实现是一种常见的网站保护措施,用于防止他人未经许可直接引用或盗用网站上的图片资源。下面将详细解释这个过程及其关键代码实现。 首先,我们来看如何实现图片加水印。在提供的代码中,...

    (经典)图片的处理程序以及防止盗链的方法(含源码)

    5. **使用防盗链URL**:将图片URL设置为服务器内部可访问的路径,外部无法直接引用。 综上所述,ASP.NET 2.0提供了强大的图片处理能力和防盗链策略。通过HttpHandler,我们可以实现图片的动态处理和安全控制,保护...

Global site tag (gtag.js) - Google Analytics