ASP.NET過(guò)濾類SqlFilter,防止SQL注入 原創(chuàng)
什么是SQL注入?
我理解的sql注入就是一些人可以通過(guò)惡意的參數(shù)輸入,讓后臺(tái)執(zhí)行這段SQL,然后達(dá)到獲取數(shù)據(jù)或者破壞數(shù)據(jù)庫(kù)的目的!
舉個(gè)簡(jiǎn)單的查詢例子,后臺(tái)sql是拼接的:select * from Test where name='+參數(shù)傳遞+';前臺(tái)頁(yè)面要求輸入name,那么黑客可以輸入: ';DROP TABLE Test;-- 不要小瞧這一段SQL代碼:
select * from Test where name=' ';DROP TABLE Test;--';在SQL中是正確的,可執(zhí)行的,但是執(zhí)行后整個(gè)Test表都刪除了,網(wǎng)站崩潰!
最好的解決方法
最好的辦法就是不寫(xiě)拼接SQL,改用參數(shù)化SQL,推薦新項(xiàng)目使用。這里不做介紹,感興趣的朋友可以自行搜索一下,本文介紹的方法適合老項(xiàng)目,就是沒(méi)有使用參數(shù)化SQL開(kāi)發(fā)的程序。
使用過(guò)濾函數(shù)來(lái)過(guò)濾
將SQL一些危險(xiǎn)的關(guān)鍵字,還有注釋百分號(hào)以及分號(hào)這些根本在我們正常寫(xiě)代碼的時(shí)候根本不會(huì)出現(xiàn)的字符都過(guò)濾掉,這樣能最大限度的保證SQL執(zhí)行是安全的,代碼如下:
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 屬性改為可讀寫(xiě) 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 屬性改為可讀寫(xiě) 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 屬性改為可讀寫(xiě) 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); } } }
相關(guān)文章
asp.net導(dǎo)出excel的簡(jiǎn)單方法實(shí)例
這篇文章主要介紹了asp.net導(dǎo)出excel的簡(jiǎn)單方法實(shí)例,需要的朋友可以參考下2014-02-02asp.net TextBox控件設(shè)置ReadOnly后,不能回傳。
當(dāng)把一個(gè)TextBox控件ReadOnly屬性設(shè)置為True后,這個(gè)控件就不回傳了。2009-05-05JS實(shí)現(xiàn)完美include加載功能代碼
在寫(xiě)這個(gè)之前在網(wǎng)上搜索了些資料,發(fā)現(xiàn)以前寫(xiě)的include都存在2個(gè)問(wèn)題,這也是include需要解決的比較重要的2個(gè)問(wèn)題。2010-10-10asp.net button 綁定多個(gè)參數(shù)
asp.net button 綁定多個(gè)參數(shù)的代碼2008-11-11ASP.NET Core啟動(dòng)地址配置方法及優(yōu)先級(jí)順序
這篇文章主要介紹了ASP.NET Core啟動(dòng)地址配置方法及優(yōu)先級(jí)順序,如果在同一臺(tái)機(jī)器上運(yùn)行多個(gè)ASP.NET Core實(shí)例,使用默認(rèn)值肯定不合適,下面我們一起進(jìn)入文章了解具體內(nèi)容吧2022-03-03