惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
L
LINUX DO - 热门话题
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
Docker
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
T
Tenable Blog
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
The Hacker News
The Hacker News
Project Zero
Project Zero
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Scott Helme
Scott Helme
A
About on SuperTechFans
WordPress大学
WordPress大学
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
G
GRAHAM CLULEY
Latest news
Latest news
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

博客园 - 脑瓜子

博文阅读密码验证 - 博客园 开发 SQLite学习手册(转) 缓存数据库redis、memcached。 MongoDB 资源集锦 在GOOGLE浏览器中模拟移动浏览器 调试Web app 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略 脑瓜子的文章导航 脑瓜子的学院系列文章汇总 博文阅读密码验证 - 博客园 ASP.NET MVC 中实现View与Controller分离 [开源]C#中开源软件大汇总(外国的) 百度知道回答内容呈现给大家分享下 团购网是否能拯救那些因为运费问题而滞销的农产品? 个人的用户体验感想+点评jobily 发的日志 作为一个技术人员,终于有了自己的第一个作品 博文阅读密码验证 - 博客园 HttpHandler(ashx)中获取Session状态 - 脑瓜子 - 博客园
ASP.NET中上传图片检测其是否为真实的图片 防范病毒上传至服务器
脑瓜子 · 2014-02-14 · via 博客园 - 脑瓜子

一、需求

我们在用.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版比较简单就不上传了。