博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
恶意访问网站的策略处理,IP访问限制
阅读量:4610 次
发布时间:2019-06-09

本文共 3626 字,大约阅读时间需要 12 分钟。

一、背景

在我们开发网站的时候,一般都会把管理员后台的目录命名为admin这样的,当一些别有用心的人就会去找到这样的路径进行管理员密码的暴力破解。还有一些就是暴力去探索管理员后台的登录路径,再进一步进行破解。

非常的不幸,上个月我的网站就遭到了恶运,甚至还被SQL注入的方式来试我的网站,造成我的错误日志文件有3兆那么多。

如图:

从日志的分析来看,这些一定是通过暴力的工具访问的,目的就是想得到后台登录地址。如果每天都被这样的工具来破解,那么服务器的承受压力一样非常的大。

逼于种种的担忧和压迫,最后我想了一个策略来限制这类事情的发生,那就是限制IP访问。

二、策略

当访问网站时,有错误发生,这个错误可以是错误的URL或者SQL注入的关键字,就记录访问者的IP,当恶意访问这的IP数达到一定的数目时就禁止访问。

如图:

数据库:

在Application_Error全局函数里进行用户的IP记录:

//出错时记录用户IPstring ip = Request.UserHostAddress;MaliciousAccess.Service.MaliciousAccessService.Instance.Add_Entity(new Service.MaliciousAccess(){   IP = ip,    CreateTime = DateTime.Now});Response.Redirect("error.html");

 然后,我自定义了一个httpmodule的类来拦截所有的URL访问,在这个类中,我会先判断是否为SQL注入的URL,再来判断是否达到IP上线,因为SQL注入的方式访问网站,是不会跳到错误处理函数的。

/* ============================================================================== * 类名称	:MaliciousAccess * 类描述	: * 创建人	:Jim * 创建时间	:2013/5/3 10:35:50 * ==============================================================================*/using System;using System.Web;using System.Data;namespace MaliciousAccess.Service{    public class HttpModule : IHttpModule    {        private int errorcount = 20;//错误访问数        ///         /// 您将需要在您网站的 web.config 文件中配置此模块,        /// 并向 IIS 注册此模块,然后才能使用。有关详细信息,        /// 请参见下面的链接: http://go.microsoft.com/?linkid=8101007        ///         #region IHttpModule Members        public void Dispose()        {            //此处放置清除代码。        }        public void Init(HttpApplication context)        {            context.PreRequestHandlerExecute += new EventHandler(OnPreRequest);        }        #endregion        public void OnPreRequest(Object source, EventArgs e)        {            //可以在此放置自定义日志记录逻辑            goErr(Uri.UnescapeDataString(HttpContext.Current.Request.Url.AbsoluteUri));//Sql注入IP限制            //普通错误访问IP限制            if (HttpContext.Current.Request.Url.AbsolutePath.IndexOf("Error.aspx") <= -1)            {                DataTable dt = Service.MaliciousAccessService.Instance.db.FromSql("select count(*) from MaliciousAccess where convert(varchar(10),CreateTime,120)='" + DateTime.Now.ToString("yyyy-MM-dd") + "' ").ToTable() as DataTable;                if (int.Parse(dt.Rows[0][0].ToString()) > errorcount)                {                    HttpContext.Current.Response.Redirect("Error.aspx");                }            }        }        ///          /// SQL注入过滤         ///          /// 要过滤的字符串          /// 
如果参数存在不安全字符,则返回true
public bool SqlFilter(string InText) { string word = "and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join|cmd"; if (InText == null) return false; foreach (string i in word.Split('|')) { if ((InText.ToLower().IndexOf(i + " ") > -1) || (InText.ToLower().IndexOf(" " + i) > -1)) { return true; } } return false; } /// /// 校验参数是否存在SQL字符 /// /// private void goErr(string tm) { if (SqlFilter(tm)) { string ip = HttpContext.Current.Request.UserHostAddress; MaliciousAccessService.Instance.Add_Entity(new Service.MaliciousAccess() { IP = ip, CreateTime = DateTime.Now }); HttpContext.Current.Response.Redirect("Error.html"); } } }}

 

三、总结

这样应该有效的防止恶意访问了吧,暂时只想到这种方式,如果大家有更好的方式,欢迎大家交流一下哈。

最后附上例子:(链接: 密码: mgxz)

数据库访问组件使用的是:

转载于:https://www.cnblogs.com/EasonJim/archive/2013/05/07/3064794.html

你可能感兴趣的文章
工作学习常识1
查看>>
Eclipse插件项目中读取文件
查看>>
jquery定义链接跳转的高亮显示
查看>>
CheckListBox怎样得到多选值?
查看>>
三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
mysql 数据表操作 目录
查看>>
iOS常用第三方库 -转
查看>>
Android布局学习
查看>>
jQuery中事件绑定与解绑
查看>>
js原生Ajax的封装与使用
查看>>
周总结6
查看>>
PostgreSQL 务实应用(二/5)插入冲突
查看>>
一种公众号回复关键词机制
查看>>
java多线程入门学习(一)
查看>>
基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!
查看>>
nyist oj 138 找球号(二)(hash 表+位运算)
查看>>
Movidius软件手册阅读 2017-09-04
查看>>
ytu 1910:字符统计(水题)
查看>>
201671030110 姜佳宇 实验三作业互评与改进
查看>>