网站网址: http://wapit.cn
网站功能就是实现一个手机与电脑都可以使用的文件上传下载. 可以帮你把手机文件传给电脑以及把电脑文件传给手机.前天晚上才发布出来, 结果昨晚就被人攻击了.
数据库里被人传满了:full your DISK.wma的文件. 一看数据库, 被占用了近3个G(因为考虑到这个文件都不大, 直接用二进制格式保存在数据库的).幸好攻击只持续了一个多小时. 如果他坚持下去的话, 我服务器肯定是被他full了......请教可以如何防止?我现在想到的办法有: 
1. 验证码(但给使用带来麻烦)
2. 上传字段中带个隐藏字段请高手支招.

解决方案 »

  1.   

    没用控件. 就用了.NET的Request.Files读到上传过来的文件.
      

  2.   

    葛优哥哥都不知道, 你在.NET版白混了. 
    不过别急,等下你就知道了
      

  3.   


    using System;
    using System.Data;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;/// <summary>
    ///LoginXian 的摘要说明
    /// </summary>
    public class LoginXian
    {
       //设置时间 5分钟
        private const int DURATION = 5;
        public enum ActionTypeEnum
        {
           //提交页面的次数(在一台机器。相同IP 。连续最多提交10次页面。 如果超出次数 5分钟之内不能在进行提交)
            Normal = 10,
            Postback = 10
        }
        public static bool IsValid(ActionTypeEnum actionType)
        {
            HttpContext context = HttpContext.Current;
            if (context.Request.Browser.Crawler) return false;
            string key = actionType.ToString() + context.Request.UserHostAddress;        int hit = (Int32)(context.Cache[key] ?? 0);
            if (hit > (Int32)actionType) return false;
            else hit++;        if (hit == 1)
            {
                context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);        }
            else
            {
                context.Cache[key] = hit;
            }
            return true;
        }
    }
      

  4.   

    调用。    protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);        if (!IsPostBack)
            {
                if (!LoginXian.IsValid(LoginXian.ActionTypeEnum.Normal))
                {
                    Response.Write("您发送得太频繁,被系统限制5分钟!请5分钟后在重新输入!");
                    Response.End();
                }
            }
            else
            {
                if (!LoginXian.IsValid(LoginXian.ActionTypeEnum.Postback))
                {
                    Response.Write("您发送得太频繁,被系统限制5分钟!请5分钟后在重新输入!");
                    Response.End();
                }
           }
        }放到你的页面的CS上。。然后再Page_Load里调用OnInit()就OK了
      

  5.   

    这个不可行. 因为如果真正用手机上传的人多了的话, 都用移动CMWAP网关的话, 很可能一个省的移动用户IP都是相同的(就是CMWAP网关IP)
      

  6.   

    用的是 key 值啊放心行了
      

  7.   

    if(一台机器&&相同IP){才执行}
    else{不会执行}
      

  8.   

    哥们 你那 http://wapit.cn  里面的上传功能 能让我学习学习吗? [email protected]!!
    谢谢 正为手机上传功能苦恼中!
      

  9.   

    1.验证码是可以的. 但会给用户使用上带来麻烦(我感觉每次都要输个验证码很烦),而且在国内有的地方的手机上网运营商屏蔽了Cookie的.
    2.IP限制在这个项目中不可行. 因为移动手机用户大多数采用CMWAP上网, 这样的话同一个城市甚至一个省都是同一个IP地址(网关IP).
    我想到的办法就是在上传窗体显示时带一个隐藏字段,保存一段随机字符串, 同时在服务端记录这个字符串的存在. 然后用户上传时先判断这个字段的内容是否在服务器中有记录, 如果没有, 则拒绝上传. 存在则上完, 完事后服务器中删除该记录.
    这样有个好处就是用户使用时感受不到, 同时又拒绝了其它地方过来的恶意请求. 但是如果有人写程序模拟出了这个请求过程来针对这个来攻击的话就无能为力了.等高人点评
      

  10.   

    等等 这网站 是用移动窗体aspx开发的还是网站aspx开发的。。
      

  11.   

    上传代码在.NET里面真没难度. 至于手机部分......你去我网站点右键, 查看源代码, 全部出来了. 
    上传代码我贴在这吧.        private void Up()
            { 
                if (Request.Files.Count > 0)
                { 
                    try
                    {
                        HttpPostedFile file = Request.Files[0]; 
                        if (file.ContentLength <= 0 || string.IsNullOrEmpty(file.FileName))
                        {
                            if (!string.IsNullOrEmpty(file.FileName))
                                ltUpResult.Text = "文件没有上传,请选择英文路径文件<br />";
                            else
                                ltUpResult.Text = "请选择上传文件<br />";
                            return;
                        }
                        //这里保存file
                    }
                    catch
                    {
                        ltUpResult.Text = "发生错误,上传失败<br />";
                    }
                }
            }
      

  12.   

    我刚看到今天也有人攻了下......但貌似上传ASP木马啊上传gif病毒啊啥的对我影响不大. 只有昨晚那个一小时的FULL YOUR DISK.wma, 刚删除了那堆文件, 677个, 占了我近3G硬盘. 呵呵. 如果再多些人坚持这个的话我想我那总共才一百多G的硬盘会撑得很爽
      

  13.   

    我苦恼的地方就是:
    我最近在做 移动窗体上传 你编写代码中 Request.Files[0] 这里面的值 我无法取到 
    所以 你能放一下 前台的 代码吗?这个网站 是 用 网站窗体编写的吗?
    是的话 估计我又要杯具了。
      

  14.   

    扩展名判断就算了. 我现在没判断任何扩展名, ASP,PHP等木马程序我想对我没影响, 读过来的文件流我是直接二进制丢数据库里的, 在服务器上没有文件保存, 下载的时候也是直接从数据库读出后输出二进制流. 不过不知道这个有没有安全隐患.
      

  15.   

    回50楼:
    我写WAP网站从来没用过移动窗体以及服务端高级控件的. 顶多用个Literal这种, 输出时才不会自作主张给你整些什么玩意导致一些莫名其妙的问题. 
    我网站aspx页面中的源代码与你看到的源代码除了动态的提示外, 顶部多了个CodeBehind=....那一行.
      

  16.   

    学习,
    用ip限制有用么.黑客做坏事时会发送伪ip,是随机生成的.
      

  17.   


    http请求包中,加入X-Forwarded-For,ip自己编一个
      

  18.   

    呵呵. 不过那对REMOTE_ADDR应该还是没影响吧
      

  19.   

    问题是很多 判断对方ip的代码都是以X-Forwarded-For优先,只有其它值都为空时,才取REMOTE_ADDR
      

  20.   

    先让文件上传上来,验证MD5值,如果有这个MD5值的文件,抛弃上传的文件,指向已有的文件。
    如果库中没有这个MD5值,文件添入库中。MD5值一样,代表两个文件是一样的,所以没有必要在库中放一样的文件。这样改只要对服务端代码做一些调整,比较好上手。
      

  21.   

     从时间和容量看,单位时间内速度很一般。应该是 家用ADSL 的毛细管进行攻击的。我猜,他是用是选择好了文件以后,用鼠标控制软件,拼命的双击上传按钮。这样上传动作就执行了N次。你设计一个序列号一样的可逆加密算法,计算出一个字符串放在隐藏域里面,每次上传的附带的字符串都不能重复。你的程序还要验证那个字符串是否符合你的加密算法规律。
      

  22.   

    先让文件上传上来,验证MD5值,如果有这个MD5值的文件,抛弃上传的文件,指向已有的文件。 
    如果库中没有这个MD5值,文件添入库中
      

  23.   


    刚对程序进行了改进. 页面加载的时候加载了一个隐藏字段sid放在form中, 值为服务端新生成的一个Guid. 服务端同时将这个Guid值存入缓存中.上传时, 先判断页面传来的sid值, 如果为空或在服务器缓存中找不到该值, 则拒绝上传. 如果找到了, 则删除缓存中的该值, 处理上传文件. 同时在页面加载的时候生成一个新值放入sid......
      

  24.   

    LZ想的隐藏字段和MD5都可行,隐藏字段能更容易一些,达到的效果是一样的。
    验证码等内些方法都治标不治本。
      

  25.   

    你这个sid和验证码比较类似啊.在某种程序上还不如验证码.
    因为页面上的sid值是很容易获取到.
    机器人自动请求你的上传页面,从response.text中就会查找到sid的值.
    然后用xmlhttp自动上传
      

  26.   


    是这样的. 效果当然比不上验证码. 如果有人刻意跟我过不去的话我也没办法啦......天要下雨, 娘要嫁人, 随他去吧. 呵呵
    加这个sid只能防备一些初初级hacker, 闹着玩的人. 对这个站来说, 我想差不多了吧.
    想不出我这个站会引来高级黑客恶意攻击的意义. 没跟人有利益冲突, 网站性质公益.......