2013-04-22 80 views
3

我寫了一個CLR存儲過程在C#這樣SQL CLR存儲過程是否阻止注入?

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void IsUserNameExists(string strUserName, out SqlBoolean returnValue) 
{  
    using (SqlConnection connection = new SqlConnection("context connection=true")) 
    { 
     connection.Open(); 
     SqlCommand command = new SqlCommand("Select count(UserName) from [User] where UserName='" + strUserName + "'", connection); 

     int nHowMany = int.Parse(command.ExecuteScalar().ToString()); 

     if (nHowMany > 0) 
      returnValue = true; 
     else 
      returnValue = false; 
    } 
} 

是否容易受到SQL注入?我正在使用SqlParameter。任何最佳實踐?

回答

0

CLR存儲過程默認情況下不會阻止此操作。你需要自己做這件事,因爲CLR不會自動執行此操作(我想這是你想知道的實際問題)

只需更新你的代碼就可以了,你應該都很好。

[Microsoft.SqlServer.Server.SqlProcedure] 
    public static void IsUserNameExists(string strUserName, out SqlBoolean returnValue) 
    { 
     using (SqlConnection connection = new SqlConnection("context connection=true")) 
     { 
      connection.Open(); 
      SqlCommand command = new SqlCommand("Select count(UserName) from [User] where [email protected]", connection); 
      command.Parameters.Add(new SqlParameter("@UserName", strUserName)); 

      int nHowMany = int.Parse(command.ExecuteScalar().ToString()); 

      if (nHowMany > 0) 
       returnValue = true; 
      else 
       returnValue = false; 
     } 
    } 
3

防止sql注入的唯一正確方法應該是使用參數化查詢。 你正在做的事情是不安全的,因爲你串聯了字符串。

一下這個在這裏以供參考How do parameterized queries help against SQL injection?

對於clearification,爲什麼你的代碼是脆弱的:
SQLParameter甚至像'); DROP TABLE YourTable;--而言將是一個有效的輸入(因爲它是一個字符串)。這將被你用來創建內部查詢,並有你的SQL注入。

1

SQL注入容易嗎?

是:

SomeType.IsUserNameExists("'; insert into [User](UserName) values ('Malefactor_Username'); select '1", out returnValue); 

的最佳做法?

始終使用參數化查詢。