上传图片检测其是否为真实的图片(防范病毒上传)

时间:2015/10/17 11:00:00来源:互联网 作者:flyso 点击: 999 次

一、需求

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

二、主要代码

    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服务器分离,用户上传文件的时候,我们把文件存取到文件服务器中,如果文件服务器磁盘已满,该作怎么处理?当然还有如果多用户同时上传文件,对磁盘写入,我们服务器配置无法满足现有的并发写入,我们需要考虑多文件服务器,多文件服务器,那么我们在上传文件又该做怎么处理呢?这里就涉及负载均衡和分布式)


Copyright © 2005 - 2016 flyso.cn. 飞搜 版权所有 鄂ICP备11002783号-3