ASP.NET过滤类SqlFilter,防止SQL注入 原创
什么是SQL注入?
我理解的sql注入就是一些人可以通过恶意的参数输入,让后台执行这段SQL,然后达到获取数据或者破坏数据库的目的!
举个简单的查询例子,后台sql是拼接的:select*fromTestwherename='+参数传递+';前台页面要求输入name,那么黑客可以输入:';DROPTABLETest;-- 不要小瞧这一段SQL代码:
select*fromTestwherename='';DROPTABLETest;--';在SQL中是正确的,可执行的,但是执行后整个Test表都删除了,网站崩溃!
最好的解决方法
最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目使用。这里不做介绍,感兴趣的朋友可以自行搜索一下,本文介绍的方法适合老项目,就是没有使用参数化SQL开发的程序。
使用过滤函数来过滤
将SQL一些危险的关键字,还有注释百分号以及分号这些根本在我们正常写代码的时候根本不会出现的字符都过滤掉,这样能最大限度的保证SQL执行是安全的,代码如下:
publicclassSqlFilter { publicstaticvoidFilter() { stringfileter_sql="execute,exec,select,insert,update,delete,create,drop,alter,exists,table,sysobjects,truncate,union,and,order,xor,or,mid,cast,where,asc,desc,xp_cmdshell,join,declare,nvarchar,varchar,char,sp_oacreate,wscript.shell,xp_regwrite,',%,;,--"; try { //-----------------------防Post注入----------------------- if(HttpContext.Current.Request.Form!=null) { PropertyInfoisreadonly=typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly",BindingFlags.Instance|BindingFlags.NonPublic); //把Form属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.Form,false,null); for(intk=0;k<System.Web.HttpContext.Current.Request.Form.Count;k++) { stringgetsqlkey=HttpContext.Current.Request.Form.Keys[k]; stringsqlstr=HttpContext.Current.Request.Form[getsqlkey]; string[]replace_sqls=fileter_sql.Split(','); foreach(stringreplace_sqlinreplace_sqls) { sqlstr=Regex.Replace(sqlstr,replace_sql,"",RegexOptions.IgnoreCase); } HttpContext.Current.Request.Form[getsqlkey]=sqlstr; } } //-----------------------防GET注入----------------------- if(HttpContext.Current.Request.QueryString!=null) { PropertyInfoisreadonly=typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly",BindingFlags.Instance|BindingFlags.NonPublic); //把QueryString属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.QueryString,false,null); for(intk=0;k<System.Web.HttpContext.Current.Request.QueryString.Count;k++) { stringgetsqlkey=HttpContext.Current.Request.QueryString.Keys[k]; stringsqlstr=HttpContext.Current.Request.QueryString[getsqlkey]; string[]replace_sqls=fileter_sql.Split(','); foreach(stringreplace_sqlinreplace_sqls) { sqlstr=Regex.Replace(sqlstr,replace_sql,"",RegexOptions.IgnoreCase); } HttpContext.Current.Request.QueryString[getsqlkey]=sqlstr; } } //-----------------------防Cookies注入----------------------- if(HttpContext.Current.Request.Cookies!=null) { PropertyInfoisreadonly=typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly",BindingFlags.Instance|BindingFlags.NonPublic); //把Cookies属性改为可读写 isreadonly.SetValue(HttpContext.Current.Request.Cookies,false,null); for(intk=0;k<System.Web.HttpContext.Current.Request.Cookies.Count;k++) { stringgetsqlkey=HttpContext.Current.Request.Cookies.Keys[k]; stringsqlstr=HttpContext.Current.Request.Cookies[getsqlkey].Value; string[]replace_sqls=fileter_sql.Split(','); foreach(stringreplace_sqlinreplace_sqls) { sqlstr=Regex.Replace(sqlstr,replace_sql,"",RegexOptions.IgnoreCase); } HttpContext.Current.Request.Cookies[getsqlkey].Value=sqlstr; } } } catch(Exceptionex) { Console.WriteLine(ex.Message); } } }