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;