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;