我明白的sql注入就是一些人能够经由过程歹意的参数输入,让背景实行这段SQL,然后到达猎取数据或许损坏数据库的目标!
举个简朴的查询例子,背景sql是拼接的:select * from Test where name='+参数通报+';前台页面请求输入name,那末黑客能够输入: ';DROP TABLE Test;-- 不要小瞧这一段SQL代码:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是准确的,可实行的,然则实行后全部Test表都删除了,网站崩溃!
最好的解决要领
最好的要领就是不写拼接SQL,改用参数化SQL,引荐新项目运用。这里不做引见,感兴趣的朋侪能够自行搜刮一下,本文引见的要领合适老项目,就是没有运用参数化SQL开辟的顺序。
运用过滤函数来过滤
将SQL一些风险的关键字,另有解释百分号以及分号这些基础在我们一般写代码的时刻基础不会涌现的字符都过滤掉,如许能最大限制的保证SQL实行是平安的,代码以下:
public class SqlFilter { public static void Filter() { string fileter_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) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 Form 属性改成可读写 isreadonly.SetValue(HttpContext.Current.Request.Form, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.Form.Count; k++) { string getsqlkey = HttpContext.Current.Request.Form.Keys[k]; string sqlstr = HttpContext.Current.Request.Form[getsqlkey]; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.Form[getsqlkey] = sqlstr; } } // -----------------------防 GET 注入----------------------- if (HttpContext.Current.Request.QueryString != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 QueryString 属性改成可读写 isreadonly.SetValue(HttpContext.Current.Request.QueryString, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.QueryString.Count; k++) { string getsqlkey = HttpContext.Current.Request.QueryString.Keys[k]; string sqlstr = HttpContext.Current.Request.QueryString[getsqlkey]; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.QueryString[getsqlkey] = sqlstr; } } // -----------------------防 Cookies 注入----------------------- if (HttpContext.Current.Request.Cookies != null) { PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); //把 Cookies 属性改成可读写 isreadonly.SetValue(HttpContext.Current.Request.Cookies, false, null); for (int k = 0; k < System.Web.HttpContext.Current.Request.Cookies.Count; k++) { string getsqlkey = HttpContext.Current.Request.Cookies.Keys[k]; string sqlstr = HttpContext.Current.Request.Cookies[getsqlkey].Value; string[] replace_sqls = fileter_sql.Split(','); foreach (string replace_sql in replace_sqls) { sqlstr = Regex.Replace(sqlstr, replace_sql, "", RegexOptions.IgnoreCase); } HttpContext.Current.Request.Cookies[getsqlkey].Value = sqlstr; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }
更多ASP.NET过滤类SqlFilter,防备SQL注入 相干文章请关注ki4网!