最近做了一个免费发短信的小网站(http://freesms.cloudapp.net/),但发现最近有人破解了我的验证码,以每3秒/条的速度用我的短信服务来发他的广告。更换验证码程序和过滤关键字只是治标不治本的方法,为了彻底阻止此类事件的发生,我们还是来看一下怎样通过优化程序来实现。
其实同样的程序除了防止别人滥发请求以外,还对预防拒绝服务(DoS)攻击同样适用哦。不妨来看看。
基本目标:限制同一IP访问网站的频率。比如,我们限制为每240分钟来自同一IP的用户最多只能够访问首页40次、其他页面200次。
比如您现在可以打开http://freesms.cloudapp.net/ 这个网站试一试,刷新40次,就可以发现您在4小时内无法再次访问到正确的网站内容了。
基本思想:
- 用HttpContext.Cache记录访问次数
- 将IP值与用户访问方式作为共同的Key,可以对用户的不同访问方式做不同的限制。
- 超出限额时调用Response.End()。
具体代码:
一、 定义持续时间
在本例中,我们使用240分钟作为一次限制的时间。
private const int DURATION = 240
二、定义访问方式枚举
针对不同的访问方式进行不同的限制。在本例中,我们只区分两种访问方式:正常访问与PostBack。在正常应用中,您还可以根据需要增加访问不同页面的限制。
public enum ActionTypeEnum
{
Normal=40,
Postback=100
}
三、判断逻辑
- 在某IP第一次采用某种访问方式进行访问时,增加Cache的Key=访问方式+IP,返回True
- 如果Key已经存在,增加访问次数,返回True
- 如果超出次数,返回False
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;
}
四、在页面中调用
判断函数需要在页面的OnInit方法中调用。在这里需要使用一些自己定义的逻辑,来进行不同访问方式的判断。下面的例子是一个最简单的,只区分正常访问与Postback。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (!IsPostBack)
{
if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Normal))
{
Response.Write("您发送得太频繁,被系统判断为广告。广告或其他定制业务请联系邮箱admin@cloudera.cn,谢谢。- http://freesms.cloudapp.net");
Response.End();
}
}
else
{
if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback))
{
Response.Write("您发送得太频繁,被系统判断为广告。广告或其他定制业务请联系邮箱admin@cloudera.cn,谢谢。- http://freesms.cloudapp.net");
Response.End();
}
}
}
PS: 敌人总是狡诈的 ,后来我又发现那个人通过使用代理来变换IP ,继续通过我的服务发送广告。这就要继续优化程序了,比如把广告内容的md5也作为key记录下来。也许您也一样,需要面对各种各样的“敌情”。呵呵,希望本文对您有所帮助!
分享到:
相关推荐
ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP...
asp.net 统计访问量asp.net 统计访问量asp.net 统计访问量asp.net 统计访问量
asp.net 通用数据访问类 ....asp.net 通用数据访问类
asp.net网站实例新闻发布系统的完整源代码,含SQL server数据库,共享学习
好用的ASP.NET统计日访问量,总访问量
ASP.NET网站ASP.NET网站ASP.NET网站
在asp.net中,实现对网站访问量的统计,和显示此时的在线人数
《构建高性能可扩展ASP.NET网站》第二版,英文版,即《Ultra-Fast ASP.NET 4.5》
asp.net记录网站访问人数源代码 谢谢谢谢谢谢谢谢谢谢谢谢谢谢
asp.net网站后台模板asp.net网站后台模板asp.net网站后台模板asp.net网站后台模板asp.net网站后台模板asp.net网站后台模板asp.net网站后台模板asp.net网站后台模板
本章内容:C/S和B/S架构体系,静态网页与动态网页,.NET Framework简介,Visual Studio简介,ASP.NET网站的创建过程。 本章重点:ASP.NET网站的创建过程。 第2章 Web窗体与Page对象 本章内容:ASP.NET Web窗体模型...
ASP.NET 网站管理工具是ASP.NET2.0以来VS提供的操作Web.config的GUI.使用起来比直接编辑Web.config方便一些.
《ASP.NET网站开发典型模块与实例精讲》视频+源码《ASP.NET网站开发典型模块与实例精讲》视频+源码《ASP.NET网站开发典型模块与实例精讲》视频+源码《ASP.NET网站开发典型模块与实例精讲》视频+源码 下载地址 直接...
一个数据库通用访问组件,支持访问MSSQL,MYSQL,ORACAL,ACCESS等数据库,当然,还有ASP.NET常用的一些公共类库,很有价值的。
ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站ASP.NET商务网站
asp.net 网站测试要求 asp.net 网站测试要求 asp.net 网站测试要求
asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程...
如今互联网已是一个全世界热门的主题,而ASP.NET是Microsoft推出的用于设计和架构新一代Internet网站的编程环境,是建设电子商务网站的利器。本书旨在引导读者深入ASP.NET的精髓,使读者迅速掌握用ASP.NET构建一个...
本书现场构建了一个完整的Internet网站,全书共分为10章,第1章讲解基本概念,内容包括ASR.NET的设计理念和运行模型。...本书可以作为ASP.NET程序设计人员的参考资料,也可以作为网站建设及维护人员的培训班教材
ASP.NET 参考手册 在 W3School,我们提供完整的 ASP.NET 参考手册,其中包括内建对象和组件,以及它们的属性和方法。 ASP.NET 实例 ASP.NET 实例 一系列的 ASP.NET 实例。 内容目录 ASP.NET 简介 本章解释 ASP.NET...