原理很簡單:使用Global.asax中的Application_BeginRequest(object sender, EventArgs e)事件,實作表單或URL送出資料的擷取,然後通過SQLInjectionHelper類完成惡意代碼的檢查。
本代碼隻是考慮到通用性和部署簡易性,因為項目已經開發完畢,并已經上線,為避免大量修改,才寫的這個通用程式,大家可以在這裡面加入不需要檢查的表單值,這樣不檢查某些字段也是可以實作的。
直接貼代碼:
Global.ascx.cs
//在接收到一個應用程式請求時觸發。對于一個請求來說,它是第一個被觸發的事件,請求一般是使用者輸入的一個頁面請求(URL)。
void Application_BeginRequest(object sender, EventArgs e)
{
//Response.Write("通用注入檢查");
bool result = false;
if (Request.RequestType.ToUpper() == "POST")
{
result = SQLInjectionHelper.ValidUrlPostData();//Post資料檢查
}
else
result = SQLInjectionHelper.ValidUrlGetData();//Get資料檢查
if (result)
Response.Write("您送出的資料有惡意字元!");
Response.Write("<script>alert('您送出的資料有惡意字元!');<//script>");
Response.End();
}
SQLInjectionHelper.cs注入檢測輔助類
/// <summary>
/// 擷取Post的資料
/// </summary>
public static bool ValidUrlPostData()
for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)
result = ValidData(HttpContext.Current.Request.Form[i].ToString());
if (result)
{
break;
}//如果檢測存在漏洞
return result;
/// <summary>
/// 擷取QueryString中的資料
public static bool ValidUrlGetData()
for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
result = ValidData(HttpContext.Current.Request.QueryString[i].ToString());
/// 驗證是否存在注入代碼
/// <param name="inputData"></param>
public static bool ValidData(string inputData)
//裡面定義惡意字元集合
//驗證inputData是否包含惡意集合
if (Regex.IsMatch(inputData, GetRegexString()))
return true;
return false;
/// 擷取正規表達式
/// <param name="queryConditions"></param>
/// <returns></returns>
private static string GetRegexString()
//構造SQL的注入關鍵字元
string[] strBadChar = {"and"
,"exec"
,"insert"
,"select"
,"delete"
,"update"
,"count"
,"from"
,"drop"
,"asc"
,"char"
,"or"
//,"*"
,"%"
,";"
,":"
,"/'"
,"/""
,"-"
,"chr"
,"mid"
,"master"
,"truncate"
,"declare"
,"SiteName"
,"net user"
,"xp_cmdshell"
,"/add"
,"exec master.dbo.xp_cmdshell"
,"net localgroup administrators"};
//構造正規表達式
string str_Regex = ".*(";
for (int i = 0; i < strBadChar.Length - 1; i++)
str_Regex += strBadChar[i] + "|";
str_Regex += strBadChar[strBadChar.Length - 1] + ").*";
return str_Regex;
測試代碼:
1 建立表單,測試Post資料
2 直接使用Response.Redirect("TestSQLInjection.aspx?Id=100&cc=200&dd=300")或構造URL參數,測試Get資料