注册 登录
编程论坛 ASP.NET技术论坛

如何防止上传恶意文件

zh520 发布于 2007-12-28 11:24, 2425 次点击
我做了一个上传文件的功能,可不知道怎么来防止上传恶意的文件
10 回复
#2
vinson-lu2007-12-28 11:31
限制上传文件的格式
#3
soonce2007-12-29 10:36
取得该文件的MINI内容类型,从而对它进行判别
#4
lqscoke2008-01-22 20:53
嗯,楼上正解
#5
smoon2008-02-20 20:05
三楼的说的方法更好一些,不过有些hack还是能上传。。这个问题好像还没有根本的解决办法啊!
#6
skyland842008-02-21 00:20
如果HACK 是通过网站得网页上传的话 就使用客户端验证,和服务端验证;来限制用户上传的文件格式;

如果HACK 自己写了个客户端上传软件  就不在你能控制的范围内了。
就只能限定存放文件的目录权限。

或者 建立个临时目录来保存文件。
经过管理员通过的文件移动到相应的目录。
不过后台又增加处理页面,可得考虑客户是否愿意了。

不知道说得对不对。大伙讨论讨论
#7
yms1232008-02-23 14:53
上传文件检测类型到目前为止我只看到过两种,第一种是检测文件的后缀名;第二种是检测文件的头部编码,不同类型文件的头部编码是不一样的(不知道这样说恰当不,有错误希望大家指出),比如255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar...这篇文章代码多有参考网络,特此说明.

前台文件:两种方法的前台文件是一样的.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

<html xmlns="http://www. >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btn_upload" runat="server" OnClick="btn_upload_Click" Text="上传" />
</div>
</form>
</body>
</html>


后台文件:

第一种方法:安全性相对第二种低,把文本文件1.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void btn_upload_Click(object sender, EventArgs e)
  {
     Boolean fileOk = false;
     string path = Server.MapPath("~/images/");
     //判断是否已经选取文件
     if (FileUpload1.HasFile)
     {
        //取得文件的扩展名,并转换成小写
        string fileExtension =      (FileUpload1.FileName).ToLower();
        //限定只能上传jpg和gif图片
        string[] allowExtension = { ".jpg", ".gif" };
        //对上传的文件的类型进行一个个匹对
        for (int i = 0; i < allowExtension.Length; i++)
        {
            if (fileExtension == allowExtension[i])
            {
                fileOk = true;
                break;
            }
        }
    }
    else
   {
      Response.Write("<script>alert(’你还没有选择文件’);</script>");
   }
   //如果扩展名符合条件,则上传
  if (fileOk)
  {
     FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
     Response.Write("<script>alert(’上传成功’);</script>");
   }
   else
   {
   }

  }
}

第二种方法,可以实现真正意义上的文件类型判断,推荐使用这种方法.


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  protected void btn_upload_Click(object sender, EventArgs e)
  {
    try
    {
       //判断是否已经选取文件
       if (FileUpload1.HasFile)
       {
          if (IsAllowedExtension(FileUpload1))
          {
              string path = Server.MapPath("~/images/");
              FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
              Response.Write("<script>alert(’上传成功’);</script>");
           }
           else
          {
              Response.Write("<script>alert(’您只能上传jpg或者gif图片’);</script>");
           }

       }
       else
       {
           Response.Write("<script>alert(’你还没有选择文件’);</script>");
        }
   }
   catch (Exception error)
   {
      Response.Write(error.ToString());
   }
}
//真正判断文件类型的关键函数
public static bool IsAllowedExtension(FileUpload hifile)
{
    fs = new (hifile.PostedFile.FileName, , );
    r = new (fs);
   string fileclass = "";
   byte buffer;
  try
  {
     buffer = r.ReadByte();
     fileclass = buffer.ToString();
     buffer = r.ReadByte();
     fileclass += buffer.ToString();

  }
  catch
  {

  }
  r.Close();
  fs.Close();
  if (fileclass == "255216" || fileclass == "7173")//说明255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar
  {
     return true;
   }
   else
  {
     return false;
  }

 }
}
这种方式来判断文件类型可以杜绝网站经典的上传漏洞,普通上传类判断文件后缀来判断类型。黑客很容易利用构造虚假路径的手段欺骗上传程序,而从文件的根源判断,即使文件路径为虚假,但文件的编码是不好改变的。
我的网站找的一种杜绝上传网页漏洞的方法。
#8
苍琅2008-02-27 21:38
“但文件的编码是不好改变的”
还是可以改变?没有安全可靠的方法吗
#9
foshan2008-02-28 14:10
请问:word、excel文件的编码是多少???
#10
Saber02272008-03-19 09:15
[bo]以下是引用 [un]foshan[/un] 在 2008-2-28 14:10 的发言:[/bo]

请问:word、excel文件的编码是多少???

都是208207
#11
寂寞的刺猬2008-03-23 18:17
哈哈,受教了。把文章收藏起来。。。
1