您的位置:首页 > 运维架构 > 网站架构

通过程序使你的网站具有预防DOS攻击的能力 --提高站点的安全性

2008-12-26 15:05 344 查看
如果不对客户端采取访问控制策略,一个网站很容易被DOS攻击。因此有必要采取措施。
例如运行以下代码:

for( int i = 0; i < 100000; i ++ )
{
WebClient client = new WebClient();
client.DownloadString("http://www.yourwebsite.com/default.aspx");
}几分钟后,如果你的站点出现无法显示,则说明站点已经被dos攻击了。

预防策略:在一定时间内,对某个ip的访问类型及次数进行限制。用缓存记录ip地址和请求类型及次数信息。
具体实现:
定义一个枚举类型,标识用户访问的类型。分为第一次访问;再次访问。第一次访问对网站的代价较高,再次访问则代价较低。

public static class ActionValidator
{
private const int DURATION = 10; // 10 min period
public enum ActionTypeEnum
{
FirstVisit = 100, // The most expensive one, choose the value wisely.
ReVisit = 1000, // Welcome to revisit as many times as user likes
}
}
创建一个静态方法用来检查请求是否违反了设定的策略。

public static bool IsValid(ActionTypeEnum actionType)
{
HttpContext context = HttpContext.Current;
if (context.Request.Browser.Crawler) return false;
string key = actionType.ToString() + context.Request.UserHostAddress;
var hit = (HitInfo)(context.Cache[key] ?? new HitInfo());
if (hit.Hits > (int)actionType) return false;
else hit.Hits++;
if (hit.Hits == 1)
context.Cache.Add(key, hit, null, DateTime.Now.AddMinutes(DURATION),
System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
return true;
}
在httphandler或httpmodule加入对请求的判断

protected override void OnInit(EventArgs e)
{
base.OnInit(e);
// Check if revisit is valid or not
if (!base.IsPostBack)
{
// Block cookie less visit attempts
if (Profile.IsFirstVisit)
{
if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.FirstVisit)) Response.End();
}
else
{
if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.ReVisit)) Response.End();
}
}
else
{
// Limit number of postbacks
if (!ActionValidator.IsValid(ActionValidator.ActionTypeEnum.Postback)) Response.End();
}
}

这样你的站点就能预防简单的DOS攻击了。
原文:Prevent Denial of Service (DOS) attacks in your web application

转自:云和山的彼端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐