使用HttpModule实现sql防注入
2014-02-12 12:55
531 查看
使用HttpModule实现sql防注入的原因
asp.net处理Http请求时,程序得到一个请求的时候,第一个会经过Http运行时,即编译过程,在这里我们的请求会被转化为机器懂的语言。下一个,我们的请求经过不同的HttpModule,即Http模块。事实上,我们的请求到达模块时系统没有对这个请求做任何的处理,也就是说此时对于请求来讲,模块是一个请求的“必经之路”。
模块可以在这个Http请求到达真正的处理中心(HttpHandler)之前,针对这个Http请求做一些额外的工作,或者在某些情况下干脆终止满足一些条件的Http请求,从而起到一个过滤器的作用。在经过我们的模块之后,我们的Http请求才到达真正的处理中心(HttpHandler)。Http请求在经过处理之后,原路返回,经过模块,进过运行时,返回到客户端。
那么既然我们的请求无论如何都会经过HttpModule,那么我们就可以在此进行一些判断(如是否有SQL关键字等)。
使用HttpModule完整代码
文章转载自: 如何使用HttpModule实现sql防注入 http://www.studyofnet.com/news/290.html
asp.net处理Http请求时,程序得到一个请求的时候,第一个会经过Http运行时,即编译过程,在这里我们的请求会被转化为机器懂的语言。下一个,我们的请求经过不同的HttpModule,即Http模块。事实上,我们的请求到达模块时系统没有对这个请求做任何的处理,也就是说此时对于请求来讲,模块是一个请求的“必经之路”。
模块可以在这个Http请求到达真正的处理中心(HttpHandler)之前,针对这个Http请求做一些额外的工作,或者在某些情况下干脆终止满足一些条件的Http请求,从而起到一个过滤器的作用。在经过我们的模块之后,我们的Http请求才到达真正的处理中心(HttpHandler)。Http请求在经过处理之后,原路返回,经过模块,进过运行时,返回到客户端。
那么既然我们的请求无论如何都会经过HttpModule,那么我们就可以在此进行一些判断(如是否有SQL关键字等)。
使用HttpModule完整代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; namespace DotNet.Common.WebForm { /**//// <summary> /// 简单防止sql注入 /// </summary> public class SqlHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.AcquireRequestState += new EventHandler(context_AcquireRequestState); } /**//// <summary> /// 处理sql注入 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void context_AcquireRequestState(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; try { string key = string.Empty; string value = string.Empty; //url提交数据 get方式 if (context.Request.QueryString != null) { for (int i = 0; i < context.Request.QueryString.Count; i++) { key = context.Request.QueryString.Keys[i]; value = context.Server.UrlDecode(context.Request.QueryString[key]); if (!FilterSql(value)) { throw new Exception("QueryString(GET) including dangerous sql key word!"); } } } //表单提交数据 post方式 if (context.Request.Form != null) { for (int i = 0; i < context.Request.Form.Count; i++) { key = context.Request.Form.Keys[i]; if (key == "__VIEWSTATE") continue; value = context.Server.HtmlDecode(context.Request.Form[i]); if (!FilterSql(value)) { throw new Exception("Request.Form(POST) including dangerous sql key word!"); } } } } catch (Exception ex) { throw ex; } } /**//// <summary> /// 过滤非法关键字,这个可以按照项目灵活配置 /// </summary> /// <param name="key"></param> /// <returns></returns> private bool FilterSql(string key) { bool flag = true; try { if (!string.IsNullOrEmpty(key)) { //一般配置在公共的文件中,如xml文件,txt文本等等 string sqlStr = "insert |delete |select |update |exec |varchar |drop |creat |declare |truncate |cursor |begin |open|<-- |--> "; string[] sqlStrArr = sqlStr.Split('|'); foreach (string strChild in sqlStrArr) { if (key.ToUpper().IndexOf(strChild.ToUpper()) != -1) { flag = false; break; } } } } catch { flag = false; } return flag; } } }
文章转载自: 如何使用HttpModule实现sql防注入 http://www.studyofnet.com/news/290.html
相关文章推荐
- 转:使用HttpModule来实现sql的防注入
- 使用 HttpModule实现sql防注入
- 使用 HttpModule实现sql防注入
- 使用 HttpModule实现sql防注入
- 通过HttpModule实现数据库防注入
- 通过HttpModule实现数据库防注入
- 使用HttpModuleHttp模块实现cookie跨二级域名
- spring中使用servlet拦截器实现防止sql注入
- 使用HttpModule实现多个域名分别绑定到子目录URL Rewriter Module
- 在Asp.Net中使用HttpModule实现多个域名分别“绑定”到子目录
- 使用js 文件参数 以及IHttpModule实现服务验证asp.net 版的初步实现
- 在Asp.Net中使用HttpModule实现多个域名分别“绑定”到子目录
- Asp.net下使用HttpModule模拟Filter,实现权限控制
- .net sql 防注入 httpmodule
- Nginx Http认证 实现访问网站或目录密码认证保护 | 使用 HttpAuthBasicModule 模块
- 使用HttpModule实现网址重写和HttpHandler实现页面静态化冲突的解决办法
- 在Asp.Net中使用HttpModule实现多个域名分别“绑定”到子目录
- Asp.net下使用HttpModule模拟Filter,实现权限控制
- 使用 ngx_http_upstream_session_sticky_module 实现基于cookie的负载均衡