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

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

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

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

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

需要過(guò)濾的特殊字符及字符串有:
   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注入攻擊
這個(gè)例子里暫定為=號(hào)和'號(hào)
bool CheckParams(params object[] args)
{
    string[] Lawlesses={"=","'"};
    if(Lawlesses==null||Lawlesses.Length<=0)return true;
    //構(gòu)造正則表達(dá)式,例:Lawlesses是=號(hào)和'號(hào),則正則表達(dá)式為 .*[=}'].*  (正則表達(dá)式相關(guān)內(nèi)容請(qǐng)見(jiàn)MSDN)
    //另外,由于我是想做通用而且容易修改的函數(shù),所以多了一步由字符數(shù)組到正則表達(dá)式,實(shí)際使用中,直接寫正則表達(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)//如果是一個(gè)集合,則檢查集合內(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#

贊助商鏈接: