当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > asp.net中利用ashx实现图片防盗链代码

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-11   浏览: 190 ::
收藏到网摘: n/a

直接分析盗链原理:看下面用httpwatch截获的http发送的数据 GET /upload/tech/20091011/20091011143957_fc3cf452d3da8402bebb765225ce8c0e.ashx?img=/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif HTTP/1.1
Accept: */*
Referer: http://www.svnhost.cn/
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; CIBA)
Host: www.svnhost.cn
Connection: Keep-Alive
该数据包表示请求http://www.svnhost.cn/upload/tech/20091011/20091011143957_fc3cf452d3da8402bebb765225ce8c0e.ashx?img=/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif文件。我们可以看到Referer表示上一页请求页面地址,也就是文件来源。Host表示当前请求的主机地址。
下面是一个盗链的数据包
GET /upload/tech/20091011/20091011143957_fc3cf452d3da8402bebb765225ce8c0e.ashx?img=/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif HTTP/1.1
Accept: */*
Referer: http://745.cc/
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; CIBA)
Host: www.svnhost.cn
Connection: Keep-Alive
我们可以看到,上面两个数据,表示对于同一个文件:http://www.corange.cn/upload/tech/20091011/20091011143957_fc3cf452d3da8402bebb765225ce8c0e.ashx?img=/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif的请求过程,这里的不同就是Referer,也就是都是请求同一个文件,但是请求的来源是不同的。因此我们可以在程序里判断是否是来源于当前服务器,来判断是否是盗链。明白原理以后,实现防盗链就非常简单了。下面以图片防盗链来实现一个演示。ASP.NET中添加一个img.ashx文件,然后后台代码如下:
复制代码 代码如下:

using System;
using System.Collections;
using System.Data;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
namespace GetImage
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Img : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpg";
if (context.Request.UrlReferrer != null && context.Request.UrlReferrer.Host.Equals(context.Request.Url.Host, StringComparison.InvariantCultureIgnoreCase))
context.Response.WriteFile(context.Server.MapPath("~/" + context.Request.QueryString["img"]));
else
context.Response.WriteFile(context.Server.MapPath("/upload/tech/20091011/20091011143956_22ac3c5a5bf0b520d281c122d1490650.gif"));
}
public bool IsReusable
{
get
{
return false;
}
}
}
}

表示如果来源不为空,并且来源的服务器和当前服务器一致,那就表示是正常访问,非盗链。正常访问文件内容。
否则就是盗链,返回网站LOGO。
你甚至可以做成随机返回正确的图片,随机返回错误图片,或者定时返回正确图片,定时返回错误图片。
然后就是图片的使用了,这时使用图片就不是直接<input type="image" src="/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif" />了,而是<input type="image" src="/upload/tech/20091011/20091011143957_fc3cf452d3da8402bebb765225ce8c0e.ashx?img=/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif" />,就是说通过img,ashx来读取图片。别人盗链的话要用下面代码:<input type="image" src="http://www.corange.cn/upload/tech/20091011/20091011143957_fc3cf452d3da8402bebb765225ce8c0e.ashx?img=/upload/tech/20091011/20091011143956_4a47d2983c8bd392b120b627e0e1cab4.gif" />。