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

ASP.NET
赫赫大名的A*寻路算法(vb.net版本)
asp.net(c#)下Jmai去说明 使用与下载
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
asp.net下gridview 批量删除的实现方法
用CSS实现图片倾斜 只支持IE
.net get set用法小结
vs 不显示行号的操作方法
ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
ASP.Net不执行问题一解
asp.net 无限分类
让VS2008对JQuery语法的智能感知更完美一点
扩展方法ToJSON() and ParseJSON()
asp.net下PageMethods使用技巧
Linq to SQL Delete时遇到问题的解决方法
实现ASP.NET多文件上传程序代码
ASP.NET AJAX 1.0 RC开发10分钟图解
asp.net get set用法
ASP.NET下使用WScript.Shell执行命令
asp.net2.0实现邮件发送(测试成功)
Asp.net 无限级分类实例代码

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-11   浏览: 41 ::
收藏到网摘: 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" />。