当前位置: 首页 > news >正文

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版比较简单就不上传了。

转载于:https://www.cnblogs.com/naoguazi/p/MVC_Upload_File_Security.html

相关文章:

  • cmd命令行中的errorlevel和延迟赋值
  • 我的项目经理2
  • iOS 开发小常识 开发笔记
  • 程序员修炼之道(一)
  • DevExpress.XtraEditors.TextEdit 设为密码输入框
  • 层次遍历二叉树(编程之美3.10)
  • 算法起步之Prim算法
  • 我比谁都相信努力奋斗的意义
  • jsp页面中从forEach里向action里面传递其中的一个对象
  • CentOS版本选择说明
  • 读书笔记——《设计心理学2:如何管理复杂》教你应付复杂
  • 用户故事(User Story)
  • TQ2440开发板移植UBOOT-2010.06总结(3)
  • ext button 属性
  • IE,URL中文读取
  • Fabric架构演变之路
  • java取消线程实例
  • LeetCode18.四数之和 JavaScript
  • Mac转Windows的拯救指南
  • Mysql数据库的条件查询语句
  • mysql外键的使用
  • Redux 中间件分析
  • Travix是如何部署应用程序到Kubernetes上的
  • vue:响应原理
  • vuex 学习笔记 01
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 简单基于spring的redis配置(单机和集群模式)
  • 两列自适应布局方案整理
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 进程与线程(三)——进程/线程间通信
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (论文阅读30/100)Convolutional Pose Machines
  • (四) Graphivz 颜色选择
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转载)利用webkit抓取动态网页和链接
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .net/c# memcached 获取所有缓存键(keys)
  • .pyc文件是什么?
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [ACTF2020 新生赛]Include
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BZOJ 1040] 骑士
  • [C#]winform部署yolov9的onnx模型
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [HackMyVM]靶场Crossbow
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [iOS]-网络请求总结
  • [JAVA设计模式]第二部分:创建模式
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表