再谈“ASP.NET网站限制恶意访问”

    昨天我因为我网站(http://freesms.cloudapp.net  )收到了恶意攻击,我发布了ASP.NET网站限制访问频率一文,引起了博客园各位高手的激烈讨论,很多朋友朋友提出了一些疑问与改进意见,我感到非常开心。后来我也继续思考了很多,现将我的想法写下来,希望高手们再来看看,不吝赐教。o(∩_∩)o

   在众多网友中,最需要感谢的是在博客园网友王玮。你的由“ASP.NET网站限制访问频率”想到的两点问题 一文中,提到了两个问题:第一是验证码不能够明文存在Cookie中;第二是IP地址可以欺骗某些验证方式。

    这两个问题非常好,非常感谢 。 第一个问题确实存在的,我现在已经用了加密,已经不能够绕过验证了。第二个问题对于我的系统来说是不存在的,因为我的代码中并没有使用你说的那两种获取IP的方式,你无法欺骗我的系统。

     总结了大家的观点,我们主要做以下几点讨论:

  1. 采用Cookie记录验证码是最方便的方式,无论是从开发成本还是从维护、运营成本来看,都是性价比最高的。在不至于太严格要求的网站中,建议采用Cookie的方式。
  2. 验证码如果需要存入Cookie中,需要加密。加密方式有很多,最普通的是md5。但是现在网上已有很多md5密码数据库(如 http://www.cmd5.com/),有的甚至提供API,所以单纯只使用md5是靠不住的。在我的加密中,我将传统生成md5的方式做了一些修改,基本能够保证恶意访问者无法通过加密的Cookie来获取到真实验证码。
    public  static string GetMd5(string str)
        {
        string cl =DateTime.Now.Month+ str + DateTime.Now.Day;//将真实验证码加上前缀与后缀后再加密;
        string pwd = "";
        MD5 md5 = MD5.Create();//实例化一个md5对像
        // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
        byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
        s.Reverse();    //翻转生成的MD5码
        // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
        for (int i = 3; i < s.Length-1; i++) //只取MD5码的一部分;恶意访问者无法知道我取的是哪几位。
        {
        // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
        pwd = pwd + (s[i]<198?s[i]+28:s[i]).ToString("X"); // 进一步对生成的MD5码做一些改造。
        }
        return pwd;
        }
  3. 限制频繁访问是一定要做的。
    在我的网站中,正常访问的用户不可能在4小时内访问200次以上。这是有统计来源的。根据我采用的一些统计代码,我发现访问最频繁的用户,在4小时内访问的最大值仅为76次,而且这是一个最特殊的特例而已。
    所以如果我一旦发现有用户在4小时内访问太多次数, 几乎就可以判断他为恶意用户。
    这不是一个最绝对的判断方式,但仍然是可行性最高、成本最低的。
  4. 限制频繁访问的方式,使用Cache最好,使用XML最次。
    ASP.NET网站限制访问频率一文中,我提出了使用Cache来记录用户的IP、访问方式、访问次数。这也是参考了很多大型网站防止DoS攻击的方式。
    有朋友提出,使用Cache或许会造成服务器资源开销,建议使用XML;如果XML太大,可以分成零碎模块。
    我的观点是,XML文件的效率确实太差。以前我测试过,十万行数据的XML文件,一次读写操作就接近1秒,更不用说网站的频繁访问、需要频繁操作XML文件了。然后同样的十万条Cache数据,占用内容仅为几十M(如一条数据占用1k内存,十万条占用100M;然后实际操作中,1条数据远没有1k),处理速度在10毫秒内。
    不仅如此,就算我们把访问记录到XML文件中,我们对它进行读写操作,也是要将它载入内存的。而十万行数据的XML文件,与十万行Cache中的KeyValue对,占用的内存也是不能同日而语的。
    综上所述,使用XML文件进行记录,不仅不能够减少服务器压力(内存、硬盘、CPU计算次数),反而还增加了服务器压力、大大增加了请求响应时间。最好的方式仍然是使用Cache。

       暂时就这些吧。。希望大家继续给点意见,也可以去我的网站(http://freesms.cloudapp.net/)试试,看你能不能够找到漏洞进行破解 。o(∩_∩)o  非常感谢博客园的朋友,跟你们交流我非常开心!

原文地址:https://www.cnblogs.com/azure/p/1570428.html