防止图片盗链和资源恶意下载

这里首先要提一下,IIS是怎么怎么处理http请求的

当服务器接收到一个 Http请求的时候,IIS 首先需要决定如何去处理这个请求(服务器处理一个.htm页面和一个.aspx页面肯定是不一样)。那IIS依据什么去处理呢?―― 根据文件的后缀名。

服务器获取所请求的页面(也可以是文件,比如 jimmy.jpg)的后缀名以后,接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序(比如.aspx就是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll这个控制,就是.net运行时),并且这个文件也没有受到服务器端的保护(一个受保护的例子就是 App_Code中的文件,或者webconfig,一个不受保护的例子就是你的js脚本,你的图片资源文件夹),那么IIS将直接把这个文件返还给客户端。

 这里,我们看到了为什么我们无法防止盗链或者资源恶意下载,因为默认这些资源不在.net程序控制之下,当客户端请求这些资源是,服务器IIS会把这些资源直接返回给客户端。

接下来的核心目的,就是怎么能让这些资源在程序控制范围之内呢?

有两种方案

一。

1.扩展IIS配置,加入扩展名.jpg,gif等受C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll这个控制。

2.在程序里扩展httpmodule或者httphander或者Global,(如果在httphander里处理,还需要在webconfig的hander节点中定义处理.jpg,gif等httpmodule是应用程序级的,httphander是每个http请求级的)

一般为判断主机头,然后如果不是你的主机头,那么为盗链,

具体怎么做,自己定了(如返回给盗链信息,水印等)

二。如果不想控制web服务器,那么显示图片的时候就不能轻易的直接输出资源地址了,需要把图片和资源先用数据流加载,再返回到客户端,这样因为输出的时候是程序控制的,所以也是可控制的(可以用aspx或者ashx文件做成文件路径输出图片)

1.图片或资源存在数据库,以流的形式输出,

2.和上面一样,只是存在文件夹里,输出的时候加载成流,输出

3.如果下载的时候不转成流,下载的话也可以先加一个button按钮 提交服务器,隐藏或者动态生成资源链接,但是图片不能这么做.因为图片是默认显示的

然后再说一下图片防下载的解决方案

防止图片下载,

1.水印签名(也可以做为防盗链)

2.js或者flash客户端什么的屏蔽

3.把图片切成N块,(比如1000块,动态生成1000个Image拼一起,拆张和他干,我就这么做:),强烈推荐)

注:如果用切图就没办法了,毕竟是客户端,不过防盗链,防下载并不是为了个人用户开发的,是防止一些网络小偷程序等恶意软件的。

 

文件下载也是一样,文件存在数据库或者文件夹里,把文件夹的权限设为不可访问,然后用文件流输出

 

        string sFileName = Server.MapPath("1.rar");
        FileStream fileStream = new FileStream(sFileName, FileMode.Open);
        long fileSize = fileStream.Length;
        byte[] fileBuffer = new byte[fileSize];
        fileStream.Read(fileBuffer, 0, (int)fileSize);
        //如果不写fileStream.Close()语句,用户在下载过程中选择取消,将不能再次下载
        fileStream.Close();

        Context.Response.ContentType = "application/octet-stream";
        Context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode("1.rar"//隐藏路径, Encoding.UTF8));
        Context.Response.AddHeader("Content-Length", fileSize.ToString());

        Context.Response.BinaryWrite(fileBuffer);
        Context.Response.End();
        Context.Response.Close();

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值