.NET 有效的防止资源被盗链下载

作者:袖梨 2022-06-25


示例

以下示例代码演示如何防止非来自于 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中的域名即可控制哪些域名是允许的,设置是否直接下载、是否允许盗链

源码下载 http://down.111com.net/mbs/2011/08/13/link.rar

相关文章

精彩推荐