.Net防sql注入的几种方法
防sql注入的常用方法:
1、服务端对前端传过来的参数值进行类型验证;
2、服务端执行sql,使用参数化传值,而不要使用sql字符串拼接;
3、服务端对前端传过来的数据进行sql关键词过来与检测;
着重记录下服务端进行sql关键词检测:
1、sql关键词检测类:
public class SqlInjectHelper:www.introzo.com { private static string StrKeyWord = "select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec|master|net local group administrators|net user|or|and"; private static string StrSymbol = ";|(|)|[|]|{|}|%|@|*|'|!"; private HttpRequest request; public SqlInjectHelper(System.Web.HttpRequest _request) { this.request = _request; } public bool CheckSqlInject() { return CheckRequestQuery() || CheckRequestForm(); } //////检查URL中是否包含Sql注入 /// 当前HttpRequest对象 /// public bool CheckRequestQuery() { if (request.QueryString.Count > 0) { foreach (string sqlParam in this.request.QueryString) { if (sqlParam == "__VIEWSTATE") continue; if (sqlParam == "__EVENTVALIDATION") continue; if (CheckKeyWord(request.QueryString[sqlParam].ToLower())) { return true; } } } return false; } ///如果包含sql注入关键字,返回:true;否则返回:false //////检查提交的表单中是否包含Sql注入关键字 /// 当前HttpRequest对象 /// public bool CheckRequestForm() { if (request.Form.Count > 0) { foreach (string sqlParam in this.request.Form) { if (sqlParam == "__VIEWSTATE") continue; if (sqlParam == "__EVENTVALIDATION") continue; if (CheckKeyWord(request.Form[sqlParam])) { return true; } } } return false; } ///如果包含sql注入关键字,返回:true;否则返回:false //////检查字符串中是否包含Sql注入关键字 /// 被检查的字符串 /// private static bool CheckKeyWord(string _key) { string[] pattenKeyWord = StrKeyWord.Split('|'); string[] pattenSymbol = StrSymbol.Split('|'); foreach (string sqlParam in pattenKeyWord) { if (_key.Contains(sqlParam + " ") || _key.Contains(" " + sqlParam)) { return true; } } foreach (string sqlParam in pattenSymbol) { if (_key.Contains(sqlParam)) { return true; } } return false; } }如果包含sql注入关键字,返回:true;否则返回:false ///
SqlInjectHelper类中,对request的query参数和form参数进行的检测,没有对cookie的检测,如有需要,可自行加上;
2、SqlInjectHelper在哪调用呢?
1)、如果想对整个web站点的所有请求都做sql关键字检测,那就在Global.asax 的 Application_BeginRequest方法中调用;
protected void Application_BeginRequest(object sender, EventArgs e) { SqlInjectHelper myCheck = new SqlInjectHelper(Request); bool result = myCheck.CheckSqlInject(); if (result) { Response.ContentType = "text/plain"; Response.Write("您提交的数据有恶意字符!"); Response.End(); } }
2)、如果只需对某个接口文件的接口进行sql关键字检测,那只需在该文件开始处调用SqlInjectHelper类即可;
public class Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { SqlInjectHelper myCheck = new SqlInjectHelper(context.Request); bool result = myCheck.CheckSqlInject(); context.Response.ContentType = "text/plain"; context.Response.Write(result?"您提交的数据有恶意字符!":""); context.Response.StatusCode = result ? 500 : 200; } public bool IsReusable { get { return false; } } }
上面的代码就是对某个一般处理程序(ashx)添加了sql关键字检测;
3、补充说明:www.introzo.com中的 __VIEWSTATE、__EVENTVALIDATION、
在sql关键字检测方法中,排除了__VIEWSTATE、__EVENTVALIDATION这两个参数;
1)、__VIEWSTATE
ViewState是www.introzo.com中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。
ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。
当请求某个页面时,www.introzo.com把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,www.introzo.com分析回传的窗体属性,并赋给控件对应的值;
2)、__EVENTVALIDATION
__EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。
“id”属性为“__EVENTVALIDATION”的隐藏字段是www.introzo.com 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.;
4、sql关键词检测的另一个版本:该版本将所有危险字符都放在了一个正则表达式中;
该类不仅检测了sql常用关键字还有xss攻击的常用关键字
public class SafeHelper { private const string StrRegex = @"<[^>]+?style=[w]+?:expression(|b(alert|confirm|prompt)b|^+/v(8|9)|<[^>]*?=[^>]*?[^>]*?>|b(and|or)b.{1,6}?(=|>|<|binb|blikeb)|/*.+?*/|总结
相关文章
- 10-06 2022年中国调味品行业发展趋势:健康概念成为消费
- 10-06 2022-2023年中国调味品行业:市场规模与消费
- 10-06 2022年中国调味品行业趋势:疫情推动行业分销渠道
- 10-06 对标大厂,微服务网关应该这样设计!
- 10-06 对标大厂,微服务网关应该这样设计!
- 10-06 摆脱恼人的 NullPointerExceptio
- 10-06 2.7k star,最强大的开源支付系统,马上就可
- 10-06 2.7k star,最强大的开源支付系统,马上就可
- 10-06 基于标签的时间跟踪工具 Traggo
- 10-06 面试官问我,try catch 应该放在 for
- 10-06 面试官问我try catch应该在for循环里面还
- 10-06 RocketMQ源码分析监控指标分析
- 10-06 《硬盘磁头修复》:让您的数据恢复如初! (硬盘磁头
- 10-06 教你如何在电脑店恢复丢失的U盘数据(电脑店U盘数据
- 10-06 如果手机上存储的数据被破坏了怎么办? (手机数据分
- 10-06 九月开学季新教师亮相班美丽句子(九月开学季美丽句子
- 10-06 UiPath 在 3B 轮 C 轮融资中获得 2.
- 10-06 什么是长焦镜头,什么是广角镜头(什么是长焦镜头)
- 10-06 vs2010对应msdn下载_如何下载安装Visu
- 10-06 stm32芯片焊接方向(stm32芯片焊接教程)
- 最近发表