IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载
Sub Proce***equest ( _
context As HttpContext _
)
Visual Basic(用法)
Dim instance As IHttpHandler
Dim context As HttpContext
instance.Proce***equest(context)
C#
void Proce***equest (
HttpContext context
)
using System.IO;
using System.Web;
/// <summary>
/// 说明:DownloadHandler是一个防盗链的类,它可以防止本站资源被别的网站盗用
/// 作者:周公
/// 日期:2008-1-11
/// 首发地址:http://blog.csdn.net/zhoufoxcn
/// </summary>
public class DownloadHandler:IHttpHandler
{
public DownloadHandler()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IHttpHandler 成员
/// <summary>
/// 指示IHttpHandler 实例是否可再次使用
/// </summary>
public bool IsReusable
{
get { return true; }
}
/// <summary>
/// 处理请求的方法
/// </summary>
/// <param name="context">它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。</param>
public void Proce***equest(HttpContext context)
{
Uri referrerUri = context.Request.UrlReferrer;//获取下载之前访问的那个页面的uri
Uri currentUri = context.Request.Url;
if (referrerUri == null)//没有前导页,直接访问下载页
{
//输出提示,可以根据自身要求完善此处代码
context.Response.Write("请不要盗链本站资源,请从首页访问。<a href='index.aspx'>首页</a>");
return;
}
#region 判断前导页是否位于本站可以用此段代码
//if (referrerUri.Host == currentUri.Host)//前导页和当前请求页位于同一个主机
//{
// //用户是通过正常路径访问的,向用户提供下载文件
// //实际情况是根据id从数据库找到文件的物理路径,然后输出
// //为了简单代码,仅仅演示流程,这里我直接输出了文件
// //周公注。2008-1-11
// //获取请求的物理文件路径
// WriteFile(context);
//}
//else
//{
// //输出提示,可以根据自身要求完善此处代码
// context.Response.Write("请不要盗链本站资源,请从首页访问。<a href='index.aspx'>首页</a>");
//}
#endregion
#region 判断前导页是否是我们的介绍页面
string referrerPage = referrerUri.LocalPath.Substring(referrerUri.LocalPath.LastIndexOf('/')+1);
if (referrerPage == "Details.aspx")//如果前导页是我们的介绍页面
{
//用户是通过正常路径访问的,向用户提供下载文件
//实际情况是根据id从数据库找到文件的物理路径,然后输出
//为了简单代码,仅仅演示流程,这里我直接输出了文件
//周公注。2008-1-11
//获取请求的物理文件路径
WriteFile(context);
}
else
{
//输出提示,可以根据自身要求完善此处代码
context.Response.Write("请不要盗链本站资源,请从首页访问。<a href='index.aspx'>首页</a>");
}
#endregion
}
private void WriteFile(HttpContext context)
{
//用户是通过正常路径访问的,向用户提供下载文件
//实际情况是根据id从数据库找到文件的物理路径,然后输出
//为了简单代码,仅仅演示流程,这里我直接输出了文件
//周公注。2008-1-11
//获取请求的物理文件路径
string path = context.Request.PhysicalPath;
//注意这里rar文件的ContentType是application/octet-stream
//不同格式文件的contentType有可能不同
context.Response.ContentType = "application/octet-stream";
context.Response.WriteFile(path);
}
#endregion
}
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
WindowsMicrosoft.NetFrameworkv2.xConfig 中
-->
<configuration>
<appSettings>
<!--添加到图片上的水印文字-->
<add key="WaterMark" value="http://blog.csdn.net/zhoufoxcn"/>
<!--水印文字的字体大小-->
<add key="Font-Size" value="72"/>
</appSettings>
<connectionStrings/>
<system.web>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug="true"/>
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Windows"/>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
<httpHandlers>
<!--只处理UploadImages目录下的jpg文件,别的目录下的图片不处理-->
<add path="UploadImages/*.jpg" verb="*" type="ImageHandler"/>
<!--所有的对zip、rar、iso文件的请求都由DownloadHandler处理-->
<add path="*.zip" verb="*" type="DownloadHandler"/>
<add path="*.rar" verb="*" type="DownloadHandler"/>
<add path="*.iso" verb="*" type="DownloadHandler"/>
</httpHandlers>
</system.web>
</configuration>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="Download.aspx?id=1">下载</a>
</div>
</form>
</body>
</html>
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Download : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
CheckUser();
//实际情况是根据id从数据库找到文件的物理路径,然后输出
//为了简单代码,仅仅演示流程,这里我直接输出了文件
//周公注。2008-1-11
//首发地址:http://blog.csdn.net/zhoufoxcn
Response.Redirect("download/demo.rar");//这里就会交给DownloadHanddler处理了
}
}
//检查用户登录等信息
private void CheckUser()
{
//仅仅演示,具体代码根据具体要求编写
//比如用户没有登录如何处理,用户没有下载权限如何处理等
return;
}
}
(一)先打开介绍页面:
(二)点击下载链接进入下载页面:
此时出现文件保存对话框,情况正常。
(一)打开首页(非前导页,跳过这一步也没有关系)
(二)直接访问下载页面或者直接访问下载文件的实际url地址:
此时出现了我们自定义的错误提示,甚至地址栏上都出现了该文件的物理地址,可是就是没有办法下载,此时就算是利用迅雷等下载软件,下载到的也是一个无效的文件,如图:
这样就达到我们的目地了,不是通过正常途径来下载是没有办法下载到他需要的文件的。
转载于:https://blog.51cto.com/zhoufoxcn/167036
IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载相关推荐
- IHttpHandler的妙用之防盗链
昨天粗略讲了一下IHttpHandler接口的作用和动态给图片添加水印的处理,如果对这些不太清除的朋友,建议看看这篇<IHttpHandler的妙用(1):给图片添加水印>:http:// ...
- django21:admin后台管理\media配置\图片防盗链\暴露后端资源\路由分发\时间分类
admin后台管理 创建超级用户 createsuperuser 1.到应用下的admin.py注册模型表 from django.contrib import admin from blog imp ...
- 基于NodeJS的HTTP server Plus 2:防盗链(referer)
什么是 "盗链"? "盗链" 说白了就是利用别人网站的资源链接放在自己的站点,在未经允许的情况下去获取别人网站里面的图片或者视频等资源,导致资源所有者的网站的流 ...
- Fikker防盗链原理与实现 - 不改动任何网站程序
1.说明 很多网站为了防止网站有价值的资源(可以是图片,也可以是页面)被无限制盗用,增加了防盗链检测,这样子做的目的可大大降低带宽占用,减少服务器的负荷和压力.例如我的网站图片不会直接显示在非合作伙伴 ...
- 防盗链IHttpHandler
/* * * 防盗链IHttpHandler * * * 增加了对文件关键字的选择(即仅对文件名存在某些关键字或不存在某些关键字进行过滤) * 设置web.config中<appSettings ...
- ASP.NET 防盗链源码
防盗链原理: http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么. 因此所有防盗链方法都是基于这个Referer ...
- ASP.NET中利用ashx实现图片防盗链
盗链的危害我就不说了,网上有很多. 直接分析盗链原理:看下面用httpwatch截获的http发送的数据 GET /Img.ashx?img=svn_work.gif HTTP/1.1 Accept: ...
- 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)
一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...
- 网站防盗链就是那么简单
第一步 : 实现 IHttpHandler 接口 namespace WebHotlinkProtection { public class HotlinkProtectionHandler:IHtt ...
最新文章
- DataSet 动态添加列
- 云原生生态周报 Vol. 19 | Helm 推荐用户转向 V3
- 如何用计算机加出5281314,电脑每次开机进入桌面后都黑屏两次,然后就好了,什么情况?怎么处理...
- Day03 javascript详解
- GDB下查看内存命令(x命令)
- blue html中转换,Vue/Vue中Html和Markdown互相转换/README.md · bluemoon/LearningNotes - Gitee.com...
- XEngine:深度学习模型推理优化
- [微积分] 常用定义与公式
- CAD/CAM编程排料软件提高钣金制造业竞争力
- 快速(动易)模板制作
- 国家统计局统计用区划代码和城乡划分代码---爬虫、详细分析
- TFS 2010安装指南
- python导入pymysql模块_pymysql 模块简单使用
- 桌面软件图标变白怎么解决
- 前端加速必备之BootCDN
- 403forbidden
- JAVA-关于计算器的简单图形界面设计例子(不实现功能)
- 艾司博讯:拼多多发货地址在哪里看
- QHeaderView 表头设置QWidget控件
- python用什么方式可以打印换行字符串_字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。...
热门文章
- 在loadrunner中使用winsocket协议编写脚步三部曲
- 如何使用Visual Studio 2010(VS2010)编译C语言
- Springboot监控之一:SpringBoot四大神器之Actuator之3-springBoot的监控和管理--指标说明...
- Oracle 内存参数设置
- 项目问题思考之策略模式
- jboss的几个常用操作
- 学习笔记---母板页、用户控件、第三方控件及视图状态管理
- MD5算法 —— C语言实现(字符串的加密)
- BZOJ2938:[POI2000] 病毒
- Linux的vi命令作用?