| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2411 人关注过本帖
标题:如何防止上传恶意文件
只看楼主 加入收藏
zh520
Rank: 1
等 级:禁止发言
帖 子:58
专家分:0
注 册:2007-8-24
收藏
 问题点数:0 回复次数:10 
如何防止上传恶意文件
提示: 作者被禁止或删除 内容自动屏蔽
搜索更多相关主题的帖子: 上传恶意 文件 功能 
2007-12-28 11:24
vinson-lu
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2007-12-27
收藏
得分:0 
限制上传文件的格式
2007-12-28 11:31
soonce
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-12-23
收藏
得分:0 
取得该文件的MINI内容类型,从而对它进行判别
2007-12-29 10:36
lqscoke
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-1-22
收藏
得分:0 
嗯,楼上正解
2008-01-22 20:53
smoon
Rank: 1
等 级:禁止访问
帖 子:461
专家分:0
注 册:2006-4-29
收藏
得分:0 
三楼的说的方法更好一些,不过有些hack还是能上传。。这个问题好像还没有根本的解决办法啊!
2008-02-20 20:05
skyland84
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2006-10-9
收藏
得分:0 
如果HACK 是通过网站得网页上传的话 就使用客户端验证,和服务端验证;来限制用户上传的文件格式;

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

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

不知道说得对不对。大伙讨论讨论

决定人生~
2008-02-21 00:20
yms123
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:209
帖 子:12488
专家分:19042
注 册:2004-7-17
收藏
得分:0 
上传文件检测类型到目前为止我只看到过两种,第一种是检测文件的后缀名;第二种是检测文件的头部编码,不同类型文件的头部编码是不一样的(不知道这样说恰当不,有错误希望大家指出),比如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;
  }

 }
}
这种方式来判断文件类型可以杜绝网站经典的上传漏洞,普通上传类判断文件后缀来判断类型。黑客很容易利用构造虚假路径的手段欺骗上传程序,而从文件的根源判断,即使文件路径为虚假,但文件的编码是不好改变的。
我的网站找的一种杜绝上传网页漏洞的方法。
2008-02-23 14:53
苍琅
Rank: 1
等 级:新手上路
帖 子:116
专家分:0
注 册:2006-12-11
收藏
得分:0 
“但文件的编码是不好改变的”
还是可以改变?没有安全可靠的方法吗

现实的残酷并不能磨灭我们对生活的渴望! " target="_blank">http://canglangjv.
2008-02-27 21:38
foshan
Rank: 1
等 级:新手上路
威 望:2
帖 子:605
专家分:0
注 册:2006-3-1
收藏
得分:0 
请问:word、excel文件的编码是多少???

我是2.0超级菜鸟,请多多教导!
2008-02-28 14:10
Saber0227
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2008-3-19
收藏
得分:0 
[bo]以下是引用 [un]foshan[/un] 在 2008-2-28 14:10 的发言:[/bo]

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

都是208207
2008-03-19 09:15
快速回复:如何防止上传恶意文件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018289 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved