您的位置:首页 > 编程学习 > Web > 正文

如何有效的限制上传文件类型

更多 时间:2013-7-10 类别:编程学习 浏览量:2706

如何有效的限制上传文件类型

如何有效的限制上传文件类型

在上传文件过程中,可以通过修改扩展名来逃过文件类型的判断并实现上传,就需要可以验证究竟是什么文件,下面介绍几种限制上传文件类型的几种方法与区别。

 

一、非常不安全的限制文件类型的方法,只能从表面上进行限制:

  •  
  •  
  • C# 代码   复制
  • 
    //限制文件后缀名:
    
    if(Path.GetExtension(sFilePath) != ".zip")
    { 
      Label2.Text = "本应用程序只允许上传zip格式的文件,请重新选择!";
     
      Return;
    }
    		
  • 这时如果上传后缀名不是zip的文件,就会发现文件无法上传了。不过,这并表示我们就不能把上传其他格式的文件了。其实,如果在上传前,事先把文件后缀名改成zip,上面这段代码就失去作用了。

     

    二、判断客户端发送的文件的 MIME (注一)内容类型,来进行限制,不过这个MIME也是可以修改的,而且每个浏览器对于不同的文件的MIME或许有差异,不好控制:

     

  •  
  • C# 代码   复制
  • 
    //通过文章的MIME信息进行限制:
    
    if(File1.PostedFile.ContentType != "application/zip")
    {
      Label2.Text = "本应用程序只允许上传zip格式的文件,请重新选择!";
        return;
    }
    		
  •       

    三、根据文件类型的编码来进行限制,能很好的对上传的文件类型进行限制,个人推荐使用这种方式:

     

  •  
  • C# 代码   复制
  •        
    //例如:限制图片类型,其中:jpg,jpeg,gif,bmp,png
    //分别的类型编码为: 255216,7173,6677,13780
    //byte[] file: 上传的文件集合
    //byte[] strExtensionValue: 限制的文件类型编码集
    
    public static bool IsAllowedUpfileType(byte[] fileList,string strValue)
    {
                bool bReturn = false;
                string fileclass = "";
                byte buffer;
                try
                {
                    buffer = file[0];
                    fileclass = buffer.ToString();
                    buffer = file[1];
                    fileclass += buffer.ToString();
                }
                catch { }
                string[] allowedExtensions = strExtensionValue.Split(',');
                for (int i = 0; i < allowedExtensions.Length; i++)
                {
                    if (fileclass == allowedExtensions[i])
                    {
                        bReturn = true;
                        break;
                    }
                }
                return bReturn;
    }
    
    //调用:
    byte[] file = new Byte[FileData.ContentLength];
    Stream fsRead = FileData.InputStream;
    fsRead.Read(file, 0, FileData.ContentLength);
    
    bool bIsAllowed= IsAllowedUpfileType(file, "255216,7173,6677,13780");
    fsRead.Flush();
    fsRead.Close();
    
    		
  •