1. 程式人生 > >正則表示式防止SQL注入

正則表示式防止SQL注入



本來對正則表示式不是很瞭解,但由於專案需要,專案主要沒有采用儲存過程方式來儲存 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注入攻擊字元了.