示例
以下示例代码演示如何防止非来自于 http://www.111com.net 的域名下载文件。
public class DownHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
string server = string.Empty;
//获取外链主机(域名)名称
if (context.Request.UrlReferrer != null) { server = context.Request.UrlReferrer.Host; }
string domain = System.Configuration.ConfigurationManager.AppSettings["domain"].ToString();
FileInfo fileInfo = new FileInfo(context.Request.PhysicalPath); //获取访问文件的实际物理路径
if (server == domain) //比较是否是允许的域名
{
Debug.WriteLine(fileInfo.Extension);
down(context.Request.Path);
}
else
{
context.Response.Write(string.Format("",server,fileInfo.Name));
context.Response.End();
}
}
//流下载
public void down(string cc)
{
if (cc != "")
{
string path = System.Web.HttpContext.Current.Server.MapPath(cc);
System.IO.FileInfo file = new System.IO.FileInfo(path);
if (file.Exists)
{
System.Web.HttpContext.Current.Response.Clear();
//指定下载的文件名称
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(file.Name, Encoding.UTF8).Replace("+", "%20"));
//文件大小
System.Web.HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
//通用格式
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
System.Web.HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
System.Web.HttpContext.Current.Response.Filter.Close();
System.Web.HttpContext.Current.Response.WriteFile(file.FullName);
System.Web.HttpContext.Current.Response.End();
}
else
{
System.Web.HttpContext.Current.Response.Write("文件不存在");
System.Web.HttpContext.Current.Response.End();
}
}
}
}
context.Request.UrlReferrer 是获取有关客户端上次请求的 URL 的信息,该请求链接到当前的 URL。
context.Request.UrlReferrer.Host 在这里是获取主机(客户端访问的域名)名称。
HttpUtility.UrlEncode(file.Name, Encoding.UTF8).Replace("+", "%20") 是对下载文件名称编码。UrlEncode编码后会把文件名中的空格转换中+(+转换为%2b),但是浏览器是不能理解加号为空格的,所以在浏览器下载得到的文件,空格就变成了加号。UrlEncode 之后, 将 "+" 替换成 "%20",因为浏览器将%20转换为空格。
允许下载文件的主机我们在web.config中配置:
注册HTTP处理程序
修改web.config配置文件
IIS6
IIS7
path="/uploadfiles/files/*.*" 表示只有这里目录里的所有文件才使用KnownWebHandler HTTP处理程序处理
通过设置web.config中的域名即可控制哪些域名是允许的,设置是否直接下载、是否允许盗链