C# 檢查字符串防SQL注入攻擊

2010-08-28 10:49:09來源:西部e網(wǎng)作者:

SQL注入式攻擊是利用是指利用設(shè)計上的漏洞,在目標(biāo)服務(wù)器上運行Sql命令以及進(jìn)行其他方式的攻擊
動態(tài)生成Sql命令時沒有對用戶輸入的數(shù)據(jù)進(jìn)行驗證是Sql注入攻擊得逞的主要原因。
比如:
 如果你的查詢語句是select * from admin where username='"&user&"' and password='"&pwd&"'"

 那么,如果我的用戶名是:1' or '1'='1
 那么,你的查詢語句將會變成:
 select * from admin where username='1 or '1'='1' and password='"&pwd&"'"
 這樣你的查詢語句就通過了,從而就可以進(jìn)入你的管理界面。

所以防范的時候需要對用戶的輸入進(jìn)行檢查。特別式一些特殊字符,比如單引號,雙引號,分號,逗號,冒號,連接號等進(jìn)行轉(zhuǎn)換或者過濾。

需要過濾的特殊字符及字符串有:
   net user
   xp_cmdshell
   /add
   exec master.dbo.xp_cmdshell
   net localgroup administrators
   select
   count
   Asc
   char
   mid
   '
   :
   "
   insert
   delete from
   drop table
   update
   truncate
   from
   %

C# 檢查字符串,防SQL注入攻擊
這個例子里暫定為=號和'號
bool CheckParams(params object[] args)
{
    string[] Lawlesses={"=","'"};
    if(Lawlesses==null||Lawlesses.Length<=0)return true;
    //構(gòu)造正則表達(dá)式,例:Lawlesses是=號和'號,則正則表達(dá)式為 .*[=}'].*  (正則表達(dá)式相關(guān)內(nèi)容請見MSDN)
    //另外,由于我是想做通用而且容易修改的函數(shù),所以多了一步由字符數(shù)組到正則表達(dá)式,實際使用中,直接寫正則表達(dá)式亦可;
    string str_Regex=".*[";
    for(int i=0;i< Lawlesses.Length-1;i++)
        str_Regex+=Lawlesses[i]+"|";
    str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
    //
    foreach(object arg in args)
    {
        if(arg is string)//如果是字符串,直接檢查
        {
            if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
            return false;
        }
        else if(arg is ICollection)//如果是一個集合,則檢查集合內(nèi)元素是否字符串,是字符串,就進(jìn)行檢查
        {
            foreach(object obj in (ICollection)arg)
            {
                if(obj is string)
                {
                    if(Regex.Matches(obj.ToString(),str_Regex).Count>0)
                    return false;
                }
            }
        }
    }
    return true;

關(guān)鍵詞:C#

贊助商鏈接: