zoukankan      html  css  js  c++  java
  • 上传图片检测其是否为真实的图片 防范病毒上传至服务器

    ASP.NET中上传图片检测其是否为真实的图片 防范病毒上传至服务器

    一、需求

    我们在用.net开发网站时,经常会用到图片上传,可以说是每个网站必备的,大到门户网站,电商网站,政务系统,OA系统,小到企业网站,个人网站,博客网站,导航网站等等,都有用到图片上传,那么在客户端浏览器中上传图片,不可避免有些不法分子将病毒伪装图片文件,然后上传到我们的网站服务器,这样造成网站崩溃。为了解决这个问题,我们在程序中先过滤,就有了接下来的文章。

    二、主要代码

    1、MVC中

    我们就来上传一个头像,在MVC中怎么实现文件上传,请查看我的文章:【MVC系列】ASP.NET MVC中如何实现文件上传 FileUpLoad

           /// <summary>
           /// 上传头像
            /// </summary>
           /// <param name="userId">用户编号</param>
           /// <returns>Json(-1表示系统异常,-2表示文件不合法)</returns>
            [HttpPost] 
            public JsonResult Upload(string userId)
            {
                //上传头像的路径
                string folderPath = "/upload/avatar/";
                //判断路径是否存在
                if (!Directory.Exists(folderPath))
                    Directory.CreateDirectory(folderPath);//创建文件路径
                HttpPostedFileBase uploadFile = Request.Files["avatars"];
                if (uploadFile != null)
                {
                    string oriFileName = uploadFile.FileName;//原始文件名
                    string fileName = userId + "_" + oriFileName;//文件名的格式:用户Id+文件名
                    uploadFile.SaveAs(Server.MapPath(folderPath + fileName));//保存到服务器
                    FileStream fs = new FileStream(Server.MapPath(folderPath + fileName), FileMode.Open, FileAccess.Read);
                    BinaryReader reader = new BinaryReader(fs);
                    string fileClass;
                    byte buffer;
                    byte[] b = new byte[2];
                    buffer = reader.ReadByte();
                    b[0] = buffer;
                    fileClass = buffer.ToString();
                    buffer = reader.ReadByte();
                    b[1] = buffer;
                    fileClass += buffer.ToString();
                    reader.Close();
                    fs.Close();
                    if (fileClass == "255216" || fileClass == "7173" || fileClass == "6677" || fileClass == "13780")
                    {
                        //255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar 
                        //Response.Write("图片可用"); 
                        //保存到数据库中
                    }
                    else
                    {
                       
                        //Response.Write("图片非法"); 
                        FileInfo f = new FileInfo(Server.MapPath(folderPath + fileName));
                        f.Delete(); //删除文件
                        return Json(-2, JsonRequestBehavior.AllowGet);
                    }
                    return Json(Server.HtmlEncode(folderPath + fileName), JsonRequestBehavior.AllowGet);
                }
                return Json(-1, JsonRequestBehavior.AllowGet);
    
            }

    2、WebForm中

    public void UploadFile() {
                try {
                    HttpPostedFile postfile = Request.Files["file"];
                    string savepath = Server.MapPath("/upload/avatar/" + postfile.FileName);
                    postfile.SaveAs(savepath);
                    FileStream fs = new FileStream(savepath, FileMode.Open, FileAccess.Read);
                    BinaryReader reader = new BinaryReader(fs);
                    string fileClass;
                    byte buffer;
                    byte[] b = new byte[2];
                    buffer = reader.ReadByte();
                    b[0] = buffer;
                    fileClass = buffer.ToString();
                    buffer = reader.ReadByte();
                    b[1] = buffer;
                    fileClass += buffer.ToString();
                    reader.Close();
                    fs.Close(); 
                    if (fileClass == "255216" || fileClass == "7173" || fileClass == "6677" || fileClass == "13780") {
                        //255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar 
                        //Response.Write("图片可用"); 
                        //保存到数据库中
                    }
                    else {
                        //Response.Write("图片非法"); 
                        File.Delete(savepath); //删除文件
                        return;
                    }
                }
                catch (Exception) { //Response.Write("图片非法!"); 
                    return;
                    throw;
                }
            }

    三、总结

    当然,这个只是防范病毒的一个很小的举措,技术不深奥,当然我这里写的过滤有个很大的缺陷,是先把文件上传上服务器,然后再检测,这样也不安全,可以在上传之前先检测,大家自己去实现哈。当然,上传文件要保证服务器的安全还有很多需要做的,比如在服务器中安装杀毒软件定时监测新增文件。还有硬件防火墙很多,在这里不再阐述。

    在本章中如果在MVC中文件上传无从下手的同学,可以学习到文件上传,源码中采用swfupload上传,它可以支持多文件上传。具体实现请在文章末尾下载源代码。给大家布置一个作业,作进一步思考,怎么实现跨域或分布式上传文件。(作业的需求:网站文件服务器与Web服务器分离,用户上传文件的时候,我们把文件存取到文件服务器中,如果文件服务器磁盘已满,该作怎么处理?当然还有如果多用户同时上传文件,对磁盘写入,我们服务器配置无法满足现有的并发写入,我们需要考虑多文件服务器,多文件服务器,那么我们在上传文件又该做怎么处理呢?这里就涉及负载均衡和分布式)

    大家有想法勇敢拍砖,欢迎拍砖,作业中的思考大家可以在评论中发表自己的看法。如果喜欢文章就顶我,也可以关注Me

    结尾:这篇文章之前是发表在我的CSDN博客上的,把它移步到博客园来。CSDN的文章链接地址http://blog.csdn.net/naoguazi/article/details/8786400

    最后附上全文件的源码:

    MVC 版

    Webform版比较简单就不上传了。

  • 相关阅读:
    H3 BPM让天下没有难用的流程之技术特性
    H3 BPM让天下没有难用的流程之技术体系
    H3 BPM社区:流程开发者的学习交流平台
    H3 BPM让天下没有难用的流程之功能介绍
    JFlow&CCFlow流程引擎的业务数据与流程数据同步的操作步骤.
    驰骋工作流引擎功能新增操作提示
    回答ccflow工作流程引擎的一个朋友的常见问题
    驰骋表单引擎导入字段的功能使用说明
    什么是ccflow公文流程?如何使用ccflow开发一个公文流程?
    驰骋工作流引擎对一个朋友提问的一些问题的回答.
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3549948.html
Copyright © 2011-2022 走看看