直接分析盗链原理看下面用httpwatch截获的http发送的数据
GET /Imgashx?img=svn_workgif HTTP/
Accept: */*
Referer:
AcceptLanguage: zhcn
UACPU: x
AcceptEncoding: gzip deflate
UserAgent: Mozilla/ (compatible; MSIE ; Windows NT ; NET CLR ; NET CLR ; NET CLR ; NET CLR ; CIBA)
Host:
Connection: KeepAlive
该数据包表示请求文件我们可以看到Referer表示上一页请求页面地址也就是文件来源Host表示当前请求的主机地址
下面是一个盗链的数据包
GET /Imgashx?img=svn_workgif HTTP/
Accept: */*
Referer:
AcceptLanguage: zhcn
UACPU: x
AcceptEncoding: gzip deflate
UserAgent: Mozilla/ (compatible; MSIE ; Windows NT ; NET CLR ; NET CLR ; NET CLR ; NET CLR ; CIBA)
Host:
Connection: KeepAlive
我们可以看到上面两个数据表示对于同一个文件的请求过程这里的不同就是Referer也就是都是请求同一个文件但是请求的来源是不同的因此我们可以在程序里判断是否是来源于当前服务器来判断是否是盗链明白原理以后实现防盗链就非常简单了下面以图片防盗链来实现一个演示ASPNET中添加一个imgashx文件然后后台代码如下
复制代码 代码如下:
using System;
using SystemCollections;
using SystemData;
using SystemWeb;
using SystemWebServices;
using SystemWebServicesProtocols;
namespace GetImage
{
/// <summary>
/// $codebehindclassname$ 的摘要说明
/// </summary>
[WebService(Namespace = )]
[WebServiceBinding(ConformsTo = WsiProfilesBasicProfile_)]
public class Img : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
contextResponseContentType = image/jpg;
if (contextRequestUrlReferrer != null && contextRequestUrlReferrerHostEquals(contextRequestUrlHost StringComparisonInvariantCultureIgnoreCase))
contextResponseWriteFile(contextServerMapPath(~/ + contextRequestQueryString[img]));
else
contextResponseWriteFile(contextServerMapPath(~/logogif));
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
表示如果来源不为空并且来源的服务器和当前服务器一致那就表示是正常访问非盗链正常访问文件内容
否则就是盗链返回网站LOGO
你甚至可以做成随机返回正确的图片随机返回错误图片或者定时返回正确图片定时返回错误图片
然后就是图片的使用了这时使用图片就不是直接<input type=image src=svn_workgif />了而是<input type=image src=/Imgashx?img=svn_workgif />就是说通过imgashx来读取图片别人盗链的话要用下面代码<input type=image src= />
赶紧给自己的网站加上防盗链吧!