在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近做了一个免费发短信的小网站(http://freesms.cloudapp.net/),但发现最近有人破解了我的验证码,以每3秒/条的速度用我的短信服务来发他的广告。更换验证码程序和过滤关键字只是治标不治本的方法,为了彻底阻止此类事件的发生,我们还是来看一下怎样通过优化程序来实现。 其实同样的程序除了防止别人滥发请求以外,还对预防拒绝服务(DoS)攻击同样适用哦。不妨来看看。 基本目标:限制同一IP访问网站的频率。比如,我们限制为每240分钟来自同一IP的用户最多只能够访问首页40次、其他页面200次。 比如您现在可以打开http://freesms.cloudapp.net/ 这个网站试一试,刷新40次,就可以发现您在4小时内无法再次访问到正确的网站内容了。 基本思想:
具体代码: 一、 定义持续时间 在本例中,我们使用240分钟作为一次限制的时间。 private const int DURATION = 240
二、定义访问方式枚举
三、判断逻辑
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("您发送得太频繁,被系统判断为广告。广告或其他定制业务请联系邮箱[email protected],谢谢。- http://freesms.cloudapp.net");
Response.End();
}
}
else
{
if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback))
{
Response.Write("您发送得太频繁,被系统判断为广告。广告或其他定制业务请联系邮箱[email protected],谢谢。- http://freesms.cloudapp.net");
Response.End();
}
}
}
PS: 敌人总是狡诈的 ,后来我又发现那个人通过使用代理来变换IP ,继续通过我的服务发送广告。这就要继续优化程序了,比如把广告内容的md5也作为key记录下来。也许您也一样,需要面对各种各样的“敌情”。呵呵,希望本文对您有所帮助! |
请发表评论