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


    这里首先要提一下,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();

  • 相关阅读:
    react项目建立导入包问题总结
    React中创建组件的3种方式
    export default与export的区别
    vue中的过滤器
    git clone https://chromium.googlesource.com/失败
    typescript 实现函数重载
    Rename a local and remote branch in git
    使用typescript开发react应用
    自己实现一个Promise库
    【翻译】Webpack 4 从0配置到生产模式
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1352830.html
Copyright © 2020-2023  润新知