屏蔽 你的IP

hetengfei_ 2011-11-16 05:01:28
近最发现 有几个IP 频凡 的请求注册。老是上传一些不对劲的东西。
现在只好对这几个IP 进行 屏蔽,以防他们搞恶。

我们知道 每个请求都会到 全局文件下的Application_BeginRequest事件中。如下取得ip
protected void Application_BeginRequest(object sender, EventArgs e)
{
string IP = HttpContext.Current.Request.UserHostAddress ;//取得请求者的IP
//这里是在数据库中的黑名单 比较代码。
if(XXX )
{
HttpContext.Current.Response.Write("你的请求已屏蔽!");
HttpContext.Current.Response.End();//到此为至
}
}

于是我按平常的写sql 比较语句。
发现,每个请求 都要 查询数据库,这样就会大大增加 数据库的压力。

所以只好用以 空间时间 的方法了。
下面是我想出的两个方法, 不知哪个方法好。
第一个方法:
声明一个static List<string> 类型 的变量。
在 Application_Start 时查一遍数据库,把 黑名单全都写入变量中。
第二个方法:
就是平常这样写sql 比较语句,但给ObjectDataSource 声明使用缓存 一个小时。

第三个方法:
请求大家的见意!!!!

...全文
222 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hetengfei_ 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qxyywy 的回复:]
楼主 记得把10楼的回帖删了 谢谢 11楼的也删了 重复提交了
[/Quote]
只以将错就错了,
我是 没有足够的权限
qxyywy 2011-11-17
  • 打赏
  • 举报
回复
楼主 记得把10楼的回帖删了 谢谢 11楼的也删了 重复提交了
铜臂阿铁木 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hetengfei_ 的回复:]

大牛们 , 转正题。

要求 速度最快。
如果要从 1 和2 两个方法中选一,你会选哪个。
[/Quote]

依然选1

angelababa~ 2011-11-17
  • 打赏
  • 举报
回复
1.写缓存

2.放入application等

3.防火墙设置屏蔽

4.IIS屏蔽

5.ipsec屏蔽
qxyywy 2011-11-17
  • 打赏
  • 举报
回复
楼主麻烦删先前面的回帖 有不应该出现的信息 谢谢 这儿从新回复

[Quote=引用 9 楼 hetengfei_ 的回复:]

大牛们 , 转正题。

要求 速度最快。
如果要从 1 和2 两个方法中选一,你会选哪个。
[/Quote]

之前也做了个类似的功能 ,处理端放在服务单,用remoting通信
/// <summary>
/// 名 称:<br>
/// </summary>
/// <remarks>
/// 版 本:1.0<br>
/// 作 者:****<br>
/// 创始时间:2011-5-20 17:00:02<br>
/// 描 述:
/// ----------修改记录------------<br>
/// </remarks>
public class WarningHttpModule : IHttpModule, IRequiresSessionState
{
protected static readonly ILog log = LogManager.GetLogger("*******");
protected static Thread thread = null;
protected static IVisitAnalysisHandle analysisHander = null;
protected static VisitManager visitManager = VisitManager.GetInstance();
private static object LockHelper = new object();

static WarningHttpModule()
{
if (null == thread)
{
lock (LockHelper)
{
if (null == thread)
{
thread = new Thread(new ThreadStart(Process));
thread.Start();
}

}
}
if (null == analysisHander)
{
lock (LockHelper)
{
if (null == analysisHander)
{
try
{
analysisHander = (IVisitAnalysisHandle)Activator.GetObject(typeof(IVisitAnalysisHandle), "tcp://127.0.0.1:6666/GNT");
}
catch (Exception ex)
{

throw new Exception("注册预警系统信道失败", ex); ;
}
}
}
}
}

private void Application_BeginRequest(object sender, EventArgs e)
{

HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
HttpRequest request = application.Request;
HttpResponse response = application.Response;
string url = request.RawUrl.ToLower(); //获取当前原始请求的url
string ip = request.UserHostAddress;
string extension = System.IO.Path.GetExtension(url).ToLower();
//是需要检测的页面
if (extension != ".aspx" && extension != ".asmx" && extension != ".ashx")
{ return; }

//在白名单范围内
if (visitManager.IsInWhiteListIP(ip))
{ return; }

//添加到访问记录里面
visitManager.AddRequest(DateTime.Now, ip, url);

//如果是异常ip的请求页
if (url == "/visitwarning.aspx")
{
string userCode = string.Empty;
string sessionCode = string.Empty;
if (request["AuthCode"] != null)
{
userCode = request["AuthCode"].ToString().ToLower();
}
if (HttpContext.Current.Session != null && HttpContext.Current.Session["visitwarningcode"] != null)
{
sessionCode = (context.Session["visitwarningcode"] as string).ToLower();
}
if (userCode == sessionCode && !string.IsNullOrEmpty(userCode))
{
visitManager.RemoveBlackListIP(ip);
response.Redirect("/Index.aspx");
}
}
else
{
//是否是黑名单
if (visitManager.IsInBlackListIP(ip))
{
response.Redirect("/VisitWarning.aspx");
}
}
}

static void Process()
{
while (true)
{
try
{
//分析上一分钟的数据
DateTime dt = DateTime.Now.AddMinutes(-1);
Dictionary<string, Dictionary<string, int>> dic = visitManager.GetRequestRecord(dt);

//清空数据
visitManager.RemoveRequestRecord(dt);

List<BlackIP> blackIP = analysisHander.AnalysisVisit(dic);

foreach (BlackIP ip in blackIP)
visitManager.AddBlackListIP(ip);
}
catch (ThreadAbortException tae)
{
Thread.ResetAbort();
log.Error("预警系统线程异常!", tae);
}
catch (Exception ex)
{
log.Error("预警系统异常!", ex);
}
finally
{
Thread.Sleep(60 * 1000);
}
}
}

public void Init(HttpApplication application)
{
//之前拦截阶段
//application.BeginRequest += new EventHandler(Application_BeginRequest);
application.AcquireRequestState += new EventHandler(Application_BeginRequest);
}

public void Dispose()
{ }
}


黑名单类:
public class BlackListIP
{
public BlackListIP()
{
InitBlackListIP();
}
static object LockHelper = new object();
List<BlackIP> ipList = new List<BlackIP>();

/// <summary>
/// 初始化黑名单ip
/// </summary>
/// <param name="ipList"></param>
void InitBlackListIP()
{
//从数据库读取被名单数据并添加
IBlackIpInfoBll blackIpInfoBll = BllFactory.GetBll<IBlackIpInfoBll>();
List<BlackIpInfo> list = blackIpInfoBll.GetBlackIpInfoList(BlackIpState.Exception);
foreach(BlackIpInfo blackIpInfo in list)
{
BlackIP blackIp = new BlackIP();
blackIp.IP = blackIpInfo.BlackIp;
blackIp.LimitedEndTime = blackIpInfo.LimitedEndTime == null ? DateTime.Now.AddMinutes(10) : DateTime.Parse(blackIpInfo.LimitedEndTime.ToString());

ipList.Add(blackIp);
}

}

/// <summary>
/// 是否是黑名单ip
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public bool IsInBlackListIP(string ip)
{
return ipList.Exists((b) => { return b.IP == ip && b.LimitedEndTime > DateTime.Now; });
}

/// <summary>
/// 移除某个黑名单ip
/// </summary>
/// <param name="ip"></param>
public void RemoveBlackListIP(string ip)
{
lock (LockHelper)
ipList.RemoveAll((b) => { return b.IP == ip; });
}

/// <summary>
/// 添加某个黑名单ip
/// </summary>
/// <param name="ip"></param>
public void AddBlackListIP(BlackIP ip)
{
BlackIP blackIP = ipList.Find((b) => { return b.IP == ip.IP; });
if (blackIP != null)
{
if (ip.LimitedEndTime > blackIP.LimitedEndTime)
blackIP.LimitedEndTime = ip.LimitedEndTime;
}
else
{
lock (LockHelper)
{
ipList.Add(ip);
}
}
}

/// <summary>
/// 获取所有黑名单ip
/// </summary>
/// <returns></returns>
public List<BlackIP> GetAllBlackListIP()
{
List<BlackIP> list = new List<BlackIP>(ipList);
return list;
}
}

仅供参考 也请各位指出不足
qxyywy 2011-11-17
  • 打赏
  • 举报
回复
楼主麻烦删先前面的回帖 有不应该出现的信息 谢谢 这儿从新回复

[Quote=引用 9 楼 hetengfei_ 的回复:]

大牛们 , 转正题。

要求 速度最快。
如果要从 1 和2 两个方法中选一,你会选哪个。
[/Quote]

之前也做了个类似的功能 ,处理端放在服务单,用remoting通信
/// <summary>
/// 名 称:<br>
/// </summary>
/// <remarks>
/// 版 本:1.0<br>
/// 作 者:****<br>
/// 创始时间:2011-5-20 17:00:02<br>
/// 描 述:
/// ----------修改记录------------<br>
/// </remarks>
public class WarningHttpModule : IHttpModule, IRequiresSessionState
{
protected static readonly ILog log = LogManager.GetLogger("*******");
protected static Thread thread = null;
protected static IVisitAnalysisHandle analysisHander = null;
protected static VisitManager visitManager = VisitManager.GetInstance();
private static object LockHelper = new object();

static WarningHttpModule()
{
if (null == thread)
{
lock (LockHelper)
{
if (null == thread)
{
thread = new Thread(new ThreadStart(Process));
thread.Start();
}

}
}
if (null == analysisHander)
{
lock (LockHelper)
{
if (null == analysisHander)
{
try
{
analysisHander = (IVisitAnalysisHandle)Activator.GetObject(typeof(IVisitAnalysisHandle), "tcp://127.0.0.1:6666/GNT");
}
catch (Exception ex)
{

throw new Exception("注册预警系统信道失败", ex); ;
}
}
}
}
}

private void Application_BeginRequest(object sender, EventArgs e)
{

HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
HttpRequest request = application.Request;
HttpResponse response = application.Response;
string url = request.RawUrl.ToLower(); //获取当前原始请求的url
string ip = request.UserHostAddress;
string extension = System.IO.Path.GetExtension(url).ToLower();
//是需要检测的页面
if (extension != ".aspx" && extension != ".asmx" && extension != ".ashx")
{ return; }

//在白名单范围内
if (visitManager.IsInWhiteListIP(ip))
{ return; }

//添加到访问记录里面
visitManager.AddRequest(DateTime.Now, ip, url);

//如果是异常ip的请求页
if (url == "/visitwarning.aspx")
{
string userCode = string.Empty;
string sessionCode = string.Empty;
if (request["AuthCode"] != null)
{
userCode = request["AuthCode"].ToString().ToLower();
}
if (HttpContext.Current.Session != null && HttpContext.Current.Session["visitwarningcode"] != null)
{
sessionCode = (context.Session["visitwarningcode"] as string).ToLower();
}
if (userCode == sessionCode && !string.IsNullOrEmpty(userCode))
{
visitManager.RemoveBlackListIP(ip);
response.Redirect("/Index.aspx");
}
}
else
{
//是否是黑名单
if (visitManager.IsInBlackListIP(ip))
{
response.Redirect("/VisitWarning.aspx");
}
}
}

static void Process()
{
while (true)
{
try
{
//分析上一分钟的数据
DateTime dt = DateTime.Now.AddMinutes(-1);
Dictionary<string, Dictionary<string, int>> dic = visitManager.GetRequestRecord(dt);

//清空数据
visitManager.RemoveRequestRecord(dt);

List<BlackIP> blackIP = analysisHander.AnalysisVisit(dic);

foreach (BlackIP ip in blackIP)
visitManager.AddBlackListIP(ip);
}
catch (ThreadAbortException tae)
{
Thread.ResetAbort();
log.Error("预警系统线程异常!", tae);
}
catch (Exception ex)
{
log.Error("预警系统异常!", ex);
}
finally
{
Thread.Sleep(60 * 1000);
}
}
}

public void Init(HttpApplication application)
{
//之前拦截阶段
//application.BeginRequest += new EventHandler(Application_BeginRequest);
application.AcquireRequestState += new EventHandler(Application_BeginRequest);
}

public void Dispose()
{ }
}


黑名单类:
public class BlackListIP
{
public BlackListIP()
{
InitBlackListIP();
}
static object LockHelper = new object();
List<BlackIP> ipList = new List<BlackIP>();

/// <summary>
/// 初始化黑名单ip
/// </summary>
/// <param name="ipList"></param>
void InitBlackListIP()
{
//从数据库读取被名单数据并添加
IBlackIpInfoBll blackIpInfoBll = BllFactory.GetBll<IBlackIpInfoBll>();
List<BlackIpInfo> list = blackIpInfoBll.GetBlackIpInfoList(BlackIpState.Exception);
foreach(BlackIpInfo blackIpInfo in list)
{
BlackIP blackIp = new BlackIP();
blackIp.IP = blackIpInfo.BlackIp;
blackIp.LimitedEndTime = blackIpInfo.LimitedEndTime == null ? DateTime.Now.AddMinutes(10) : DateTime.Parse(blackIpInfo.LimitedEndTime.ToString());

ipList.Add(blackIp);
}

}

/// <summary>
/// 是否是黑名单ip
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public bool IsInBlackListIP(string ip)
{
return ipList.Exists((b) => { return b.IP == ip && b.LimitedEndTime > DateTime.Now; });
}

/// <summary>
/// 移除某个黑名单ip
/// </summary>
/// <param name="ip"></param>
public void RemoveBlackListIP(string ip)
{
lock (LockHelper)
ipList.RemoveAll((b) => { return b.IP == ip; });
}

/// <summary>
/// 添加某个黑名单ip
/// </summary>
/// <param name="ip"></param>
public void AddBlackListIP(BlackIP ip)
{
BlackIP blackIP = ipList.Find((b) => { return b.IP == ip.IP; });
if (blackIP != null)
{
if (ip.LimitedEndTime > blackIP.LimitedEndTime)
blackIP.LimitedEndTime = ip.LimitedEndTime;
}
else
{
lock (LockHelper)
{
ipList.Add(ip);
}
}
}

/// <summary>
/// 获取所有黑名单ip
/// </summary>
/// <returns></returns>
public List<BlackIP> GetAllBlackListIP()
{
List<BlackIP> list = new List<BlackIP>(ipList);
return list;
}
}

仅供参考 也请各位指出不足
qxyywy 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hetengfei_ 的回复:]

大牛们 , 转正题。

要求 速度最快。
如果要从 1 和2 两个方法中选一,你会选哪个。
[/Quote]

之前也做了个类似的功能 ,处理端放在服务单,用remoting通信
/// <summary>
/// 名 称:<br>
/// </summary>
/// <remarks>
/// 版 本:1.0<br>
/// 作 者:张泽军<br>
/// 创始时间:2011-5-20 17:00:02<br>
/// 描 述:
/// ----------修改记录------------<br>
/// </remarks>
public class WarningHttpModule : IHttpModule, IRequiresSessionState
{
protected static readonly ILog log = LogManager.GetLogger("Cqjob.UI");
protected static Thread thread = null;
protected static IVisitAnalysisHandle analysisHander = null;
protected static VisitManager visitManager = VisitManager.GetInstance();
private static object LockHelper = new object();

static WarningHttpModule()
{
if (null == thread)
{
lock (LockHelper)
{
if (null == thread)
{
thread = new Thread(new ThreadStart(Process));
thread.Start();
}

}
}
if (null == analysisHander)
{
lock (LockHelper)
{
if (null == analysisHander)
{
try
{
analysisHander = (IVisitAnalysisHandle)Activator.GetObject(typeof(IVisitAnalysisHandle), "tcp://127.0.0.1:6666/GNT");
}
catch (Exception ex)
{

throw new Exception("注册预警系统信道失败", ex); ;
}
}
}
}
}

private void Application_BeginRequest(object sender, EventArgs e)
{

HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
HttpRequest request = application.Request;
HttpResponse response = application.Response;
string url = request.RawUrl.ToLower(); //获取当前原始请求的url
string ip = request.UserHostAddress;
string extension = System.IO.Path.GetExtension(url).ToLower();
//是需要检测的页面
if (extension != ".aspx" && extension != ".asmx" && extension != ".ashx")
{ return; }

//在白名单范围内
if (visitManager.IsInWhiteListIP(ip))
{ return; }

//添加到访问记录里面
visitManager.AddRequest(DateTime.Now, ip, url);

//如果是异常ip的请求页
if (url == "/visitwarning.aspx")
{
string userCode = string.Empty;
string sessionCode = string.Empty;
if (request["AuthCode"] != null)
{
userCode = request["AuthCode"].ToString().ToLower();
}
if (HttpContext.Current.Session != null && HttpContext.Current.Session["visitwarningcode"] != null)
{
sessionCode = (context.Session["visitwarningcode"] as string).ToLower();
}
if (userCode == sessionCode && !string.IsNullOrEmpty(userCode))
{
visitManager.RemoveBlackListIP(ip);
response.Redirect("/Index.aspx");
}
}
else
{
//是否是黑名单
if (visitManager.IsInBlackListIP(ip))
{
response.Redirect("/VisitWarning.aspx");
}
}
}

static void Process()
{
while (true)
{
try
{
//分析上一分钟的数据
DateTime dt = DateTime.Now.AddMinutes(-1);
Dictionary<string, Dictionary<string, int>> dic = visitManager.GetRequestRecord(dt);

//清空数据
visitManager.RemoveRequestRecord(dt);

List<BlackIP> blackIP = analysisHander.AnalysisVisit(dic);

foreach (BlackIP ip in blackIP)
visitManager.AddBlackListIP(ip);
}
catch (ThreadAbortException tae)
{
Thread.ResetAbort();
log.Error("预警系统线程异常!", tae);
}
catch (Exception ex)
{
log.Error("预警系统异常!", ex);
}
finally
{
Thread.Sleep(60 * 1000);
}
}
}

public void Init(HttpApplication application)
{
//之前拦截阶段
//application.BeginRequest += new EventHandler(Application_BeginRequest);
application.AcquireRequestState += new EventHandler(Application_BeginRequest);
}

public void Dispose()
{ }
}


黑名单类:
public class BlackListIP
{
public BlackListIP()
{
InitBlackListIP();
}
static object LockHelper = new object();
List<BlackIP> ipList = new List<BlackIP>();

/// <summary>
/// 初始化黑名单ip
/// </summary>
/// <param name="ipList"></param>
void InitBlackListIP()
{
//从数据库读取被名单数据并添加
IBlackIpInfoBll blackIpInfoBll = BllFactory.GetBll<IBlackIpInfoBll>();
List<BlackIpInfo> list = blackIpInfoBll.GetBlackIpInfoList(BlackIpState.Exception);
foreach(BlackIpInfo blackIpInfo in list)
{
BlackIP blackIp = new BlackIP();
blackIp.IP = blackIpInfo.BlackIp;
blackIp.LimitedEndTime = blackIpInfo.LimitedEndTime == null ? DateTime.Now.AddMinutes(10) : DateTime.Parse(blackIpInfo.LimitedEndTime.ToString());

ipList.Add(blackIp);
}

}

/// <summary>
/// 是否是黑名单ip
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public bool IsInBlackListIP(string ip)
{
return ipList.Exists((b) => { return b.IP == ip && b.LimitedEndTime > DateTime.Now; });
}

/// <summary>
/// 移除某个黑名单ip
/// </summary>
/// <param name="ip"></param>
public void RemoveBlackListIP(string ip)
{
lock (LockHelper)
ipList.RemoveAll((b) => { return b.IP == ip; });
}

/// <summary>
/// 添加某个黑名单ip
/// </summary>
/// <param name="ip"></param>
public void AddBlackListIP(BlackIP ip)
{
BlackIP blackIP = ipList.Find((b) => { return b.IP == ip.IP; });
if (blackIP != null)
{
if (ip.LimitedEndTime > blackIP.LimitedEndTime)
blackIP.LimitedEndTime = ip.LimitedEndTime;
}
else
{
lock (LockHelper)
{
ipList.Add(ip);
}
}
}

/// <summary>
/// 获取所有黑名单ip
/// </summary>
/// <returns></returns>
public List<BlackIP> GetAllBlackListIP()
{
List<BlackIP> list = new List<BlackIP>(ipList);
return list;
}
}

仅供参考 也请各位指出不足
hetengfei_ 2011-11-17
  • 打赏
  • 举报
回复
大牛们 , 转正题。

要求 速度最快。
如果要从 1 和2 两个方法中选一,你会选哪个。
-晴天 2011-11-16
  • 打赏
  • 举报
回复
直接在 IIS 里屏蔽不行吗?
linus2008117 2011-11-16
  • 打赏
  • 举报
回复
软件 或硬件防火墙
hetengfei_ 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangwenquan123 的回复:]
为神马要把那些屏蔽ip放到数据库中?
[/Quote]
因为 那些黑名单不是 人找出来的,是机器用一些算法得出的,平时我们就看看报表,看看数量。
kkbac 2011-11-16
  • 打赏
  • 举报
回复
缓存吧. 还有就是, 你的黑名单数据量应该不大, 直接读取数据库吧. 数据库没你想象的那么脆弱的.
huangwenquan123 2011-11-16
  • 打赏
  • 举报
回复
为神马要把那些屏蔽ip放到数据库中?放到个xml或txt就可以了。
缓存的话可以设置依赖文件缓存,当修改你保存的ip时,缓存失效,当读取的时候就会重新读取。
hetengfei_ 2011-11-16
  • 打赏
  • 举报
回复
补充下。
这个方法我倒是会:声明一个static List<string> 类型 的变量。

而下面这个呢 zzzzz???
好象 全局文件中没有 地方放ObjectDataSource
如果用 缓存 的话,不知 如何 设置啊?
铜臂阿铁木 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 hetengfei_ 的回复:]
第一个方法:
声明一个static List<string> 类型 的变量。
在 Application_Start 时查一遍数据库,把 黑名单全都写入变量中。
[/Quote]

fangyuantdy 2011-11-16
  • 打赏
  • 举报
回复
缓存吧,放Application对象里,这个也不会占用太多内存的

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧