首頁 >資料庫 >mysql教程 >如何在 C# SqlCommand 查詢中動態指定列名,同時防止 SQL 注入?

如何在 C# SqlCommand 查詢中動態指定列名,同時防止 SQL 注入?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-18 09:18:11262瀏覽

How Can I Dynamically Specify Column Names in C# SqlCommand Queries While Preventing SQL Injection?

C# SqlCommand 中列名稱的動態查詢調整

嘗試使用SqlCommand 物件中的參數指定列名稱時,您可能會遇到錯誤指出參數不能用於列名。當嘗試執行列名稱可能不同的查詢時,此限制帶來了挑戰。

問題:

SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE name=@name; ");
prikaz.Parameters.AddWithValue("name", name);
prikaz.Parameters.AddWithValue("slot", slot);

上述程式碼嘗試使用動態列執行查詢使用參數命名,但因上述錯誤而失敗。建議的一個潛在解決方法是使用帶有列名變數聲明的預存程序 (SP)。但是,這種方法可能很麻煩。

解決方案:

您可以在運行時動態建立查詢,而不是參數化列名稱。為了確保安全,您應該將輸入列入白名單,以防止注入攻擊。以下是如何實現此目的的範例:

// TODO: verify that "slot" is an approved/expected value
SqlCommand command = new SqlCommand("SELECT [" + slot + "] FROM Users WHERE name=@name; ")
prikaz.Parameters.AddWithValue("name", name);

在此程式碼中,「slot」的值用於在執行時間建立查詢字串。參數「name」仍然使用參數來指定,以防止SQL注入。透過動態建構查詢,您可以克服在 SqlCommand 中使用列名參數的限制。

以上是如何在 C# SqlCommand 查詢中動態指定列名,同時防止 SQL 注入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn