2017-06-19 70 views
1

來自DAL的示例代碼:這種方式執行過程是安全的SQL注入?

我正在使用c#和SQL SERVER作爲數據庫。

我寫的數據庫對象的單身,和例如 功能,從MSSQL exceute程序,使用 的DbCommand和數據庫AddInParameter

我發現的主題,談指標的影響和SQL注入,但 我想知道這具體方式

private Database m_db; 
public Database getDB 
{ 
     get 
     { 
      if(m_db == null) 
        m_db = DatabaseFactory.CreateDatabase("ConnectionString"); 
      return m_db; 
     } 
} 


public void Example(string Name) 
{ 
    DbCommand dbcmd = getDB.GetStoredProcCommand("dbo.Example"); 
    getDB.AddInParameter(dbcmd, "p_Name", DbType.String, Name); 
    getDB.ExecuteNonQuery(dbcmd); 
} 

感謝

+0

這是從C#側細線,雖然這取決於你的程序的樣子。 –

+1

這完全取決於存儲在SP內的哪種命令。在C#方面,使用'AddInParameter'是安全的,但在SQL方面可能是不同的東西,如果它包含使用字符串連接的動態查詢。 –

+0

所以只要我不使用字符串連接作爲查詢它將是安全的SQL注入? @TetsuyaYamamoto –

回答

1

dbo.Example過程可以肯定仍然執行曲ERY這是不是安全的,例如:

create proc dbo.Example (@pName varchar(100)) 
as 
    declare @cmd varchar(max); 
    set @cmd = 'select Somedata from Sometable where Somecolumn = '+ @pName; 
    exec (@cmd); 

安全代碼使用PROC參數的查詢完全作爲一個參數

create proc dbo.Example (@pName varchar(100)) 
as 
    select Somedata from Sometable where Somecolumn = @pName; 
+0

正確,@您還需要考慮用於調用過程的方法(從此角度來看,您擁有的C#代碼是安全的),而且還需要考慮存儲過程如何使用這些變量。兩個關鍵原則:參數化所有內容,不要將潛在的不安全變量與乾淨的查詢混合使用。 – pcdev

+0

1.你是什麼意思關於「乾淨的查詢」? 2.如果我不會以'exec(@cmd)'作爲字符串執行上述過程並正常執行它,它會安全嗎? '創建PROC dbo.Example(@pName VARCHAR(100))作爲 從 Sometable 選擇Somedata 其中Somecolumn = + @ pName' @pcdev –

+0

1.東西被認爲是 「髒」,如果它是在任何方面來源來自不可信的輸入。這不僅意味着用戶輸入的字符串,還包括從文件,數據庫字段加載的數據或從網站下載的數據(這些數據都可能被泄露)。如果你沒有完全控制字符串的來源,那麼它是「髒」的,需要非常小心地處理。 – pcdev

相關問題