這個問題在這里已經有了答案: SqlParameter 不允許表名 - 沒有 sql 注入攻擊的其他選項? (3 個回答) 19 小時前關閉。
當使用插入查詢時,引數將正常作業,因為它用于值,但如果我將引數用于表名的創建或選擇查詢,它就不會發生,因為顯然表名必須是靜態的。
#例如
SqlCommand myCommand = new SqlCommand("create table @1 ([BACK_LANG] varchar(50)");
myCommand.Connection = myDatabase;
myCommand.Parameters.AddWithValue("@1", this.getName()); //it was already set
myCommand.ExecuteNonQuery();
但我確實需要使用帶引數的Select/Create查詢,因為我將從他們創建的表中進行選擇。
遺憾的是,我無法提出解決方案,不得不使用易受 SQL 注入攻擊的非引數方式,我過去幾天所做的谷歌搜索對我沒有幫助。
如何在帶有 .NET 的 SQL Server 中使用創建/選擇查詢作為表名?
uj5u.com熱心網友回復:
您不能將物件名稱作為引數直接傳遞給這樣的陳述句。您仍然可以使用引數,但命令必須是這樣的:
(@"declare @sql nvarchar(max) = N'create table dbo.'
QUOTENAME(@1) N'([BACK_LANG] varchar(50));';
EXEC sys.sp_executesql @sql;")
或者只是在 C# 中構建字串,使用SqlCommandBuilder提供QuoteIdentifier(this.getName())與QUOTENAME().
有關 SQL 注入的更多資訊:動態 SQL
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454750.html
上一篇:如何根據多列選擇DISTINCT記錄而不考慮它們的順序
下一篇:從SQL中洗掉空格和特殊字符
