正則表示式防止SQL注入
阿新 • • 發佈:2019-01-09
本來對正則表示式不是很瞭解,但由於專案需要,專案主要沒有采用儲存過程方式來儲存 SQL語句,所以很有可能被黑客用SQL注入攻擊,現在就在網上找了找解決辦法,在業務層來過濾SQL語句,防止SQL注入攻擊,主要是採用了正則表示式,因為正則表示式對字串的操作是很強大的.
首先用一個Validate()類來封裝正則表示式和相關操作:
//驗證是否有SQL注入字元
private bool ValidateQuery(Hashtable queryConditions)
{
//構造SQL的注入關鍵字元
#region 字元
string[] strBadChar = {"and"
,"exec"
,"insert"
,"select"
,"delete"
,"update"
,"count"
,"or"
//,"*"
,"%"
,":"
,"/'"
,"/""
,"chr"
,"mid"
,"master"
,"truncate"
,"char"
,"declare"
,"SiteName"
,"net user"
,"xp_cmdshell"
,"/add"
,"exec master.dbo.xp_cmdshell"
,"net localgroup administrators"};
#endregion
//構造正則表示式
string str_Regex = ".*("
for (int i = 0; i < strBadChar.Length - 1; i++)
{
str_Regex += strBadChar[i] + "|"
}
str_Regex += strBadChar[strBadChar.Length - 1] + ").*"
//避免查詢條件中_list情況
foreach (string str in queryConditions.Keys)
{
if(str.Substring(str.Length - 5)=="_list")
{
//去掉單引號檢驗
str_Regex = str_Regex.Replace("|'|", "|");
}
string tempStr = queryConditions[str].ToString();
if (Regex.Matches(tempStr.ToString(), str_Regex).Count > 0)
{
//有SQL注入字元
return true;
}
}
return false;
}
queryConditions 是一個hashtable,用於傳入查詢條件,hashtable中的鍵值(key)為:@name,相對應SQL中的引數,那Value則對應為引數的實際值了.
正則表示式的應用主要是按這樣的規律來過濾字串的:
.*(and|exec|select|update|or|'|''|).* // str_Regex
核心函式主要是: Regex.Matches(tempStr.ToString(), str_Regex).
要是在 tempStr 字串中含有非法字元, 則函式的Count值將大於0
好了,就這樣就可以判斷是否含有SQL注入攻擊字元了.