簡體   English   中英

使用參數化的SqlCommand是否會使我的程序不受SQL注入的影響?

[英]Does using parameterized SqlCommand make my program immune to SQL injection?

我知道SQL注入是相當危險的 現在在我的C#代碼中,我使用SqlCommand編寫參數化查詢:

SqlCommand command = ...;
command.CommandText = "SELECT * FROM Jobs WHERE JobId = @JobId;";
command.Parameters.Add("@JobId", SqlDbType.UniqueIdentifier ).Value = actualGuid;
command.ExecuteNonQuery();

這會自動使我的代碼不受SQL注入的影響嗎? 我需要做些額外的事情嗎?

我想為您的參數化查詢示例提供特定的,也許是規范的示例,是的,這足夠了。

但是,人們有時會這樣寫代碼

cmd.CommandText = string.Format("SELECT * FROM {0} WHERE col = @col;", tableName);
cmd.Parameters.Add("@col", ...);

因為根本沒有辦法將表名本身作為參數傳遞,並且有時存在執行的願望-是否被誤導了。 似乎然后常常被忽略了,tableName(除非只能從不是從任何輸入派生的一組靜態/常量值中讀取)確實允許SQL注入。

根據有關此MSDN文章的注釋,“特殊輸入字符僅對動態SQL構成威脅,而在使用參數化SQL時則不構成威脅。”

因此,我相信您可以安全地進行SQL注入。 在URL中使用標識符(例如Idendity Values)時,可能會有邏輯上的風險,但這是另一回事了。

SQL注入主要取決於動態SQL的執行。 換句話說,SQL語句是由SQL與用戶輸入的值串聯而成的。

為了完全避免SQL注入,

保護自己免受SQL注入攻擊不是很困難。 不受SQL注入攻擊影響的應用程序會驗證和清除所有用戶輸入,切勿使用動態SQL,使用具有很少特權的帳戶執行,哈希或加密其機密,並顯示錯誤信息,這些信息對黑客幾乎沒有有用的信息。 通過采取多層次的預防措施,可以確保如果繞過一個防御措施,您仍然會受到保護。

MSDN

使用SqlCommand是一種非常好的做法,只要您不將SQL字符串連接到任何地方(包括在調用的任何存儲過程中,即避免使用動態SQL),就可以免受SQL注入攻擊。

如果您使用動態sql,即使您通過參數傳遞它,也無法幸免於SQL注入。 太糟糕的SQL Server沒有內置函數來清理參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM