防止SQL隱碼攻擊

iSQlServer發表於2010-04-20

簡單的情況下,都是在前臺輸入要插入的資料,然後後臺直接把輸入的資料連線到SQL語句上,就很容易遭到SQL隱碼攻擊的問題。

 

比如:  

 

string sql=”insert into category(name) values(‘ ”+name+” ’)"; //這樣的資料輸入是通過雙引號進行的字串拼接"+字串

 

注入語句:aaa’)delete category where--   //--表示,--後面的程式碼被註釋掉後,就不執行了

 

而在單獨的SQL語句中:insert into category(name) values(‘aaa’)

 

                               insert into category(name) values(‘aaa’)delete category where--')  

 

若要防止SQL隱碼攻擊,可以使用帶引數的@字串,表示引數而不是字串;

 

string sql=”insert into category(name) values(@caName)"; //去掉@caName外面本來的單引號

 

接下來時賦值給@caName: 

 

 

SqlCommand.Parameters.Add(new SqlParameter ("@caName “,"jazyzheng"));//把jazyzheng賦值到引數caName中

 

重新賦值為SQL隱碼攻擊語句:

 

 

SqlCommand.Parameters.Add(new SqlParameter ("@caName “,"aaa’)delete category where--"));

 

當在前臺輸入資料後(aaa’)delete category where--),資料是通過引數傳入的,而不是通過直接的字串拼接方式傳入,所以輸入的資料會直接被當做引數,而不會當做字串而執行字串中的SQL語句。

 

有SqlCommand.Parameters.Add(),也有SqlCommand.Parameters.AddRange()。

 

有時候插入的SQL語句引數不止一個,比如當插入新聞的時候,就會插入諸如標題,內容,時間等多個引數。AddRange傳入的是一個陣列。

 

SqlCommand.Parameters.AddRange(new SqlParameter[]

 

{

 

   new SqlParameter("@caName","jazyzheng ")

 

});

 

比較完整的程式碼:

 

  public int ExecuteNonQuery(string sql, SqlParameter[] paras)
       
{
 
           int res;
            using (cmd = new SqlCommand(sql, GetConn()))
            {
                cmd.Parameters.AddRange(paras);
                res = cmd.ExecuteNonQuery();
            }
            return res;
        }

 

     public bool Insert(string caName)
        {
            bool flag = false;

            string sql = "update category set [name]=@caName where id=@id";
//需引用using System.Data.SqlClient;
            SqlParameter[] paras = new SqlParameter[]

 

                   {

 

                       new SqlParameter("@id",ca.Id),
                       new SqlParameter("@caName",ca.Name)

 

                   };            

 

            int res = sqlhelper.ExecuteNonQuery(sql, paras);
            if (res > 0)
            {
                flag = true;
            }
            return flag;
        }
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-660260/,如需轉載,請註明出處,否則將追究法律責任。

相關文章