2

使用OleDbCommand. 我可以添加 SQL 参数,从而使查询免受 SQL 注入的影响,但是有没有办法在FROMcluase 中做到这一点。见下文

这行得通

query = "Select * From Company Where @param = 1";
OleDbCommand Command = new OleDbCommand(query, sqlConnStr);

DataTable Table = new DataTable();
DataSet dataSet = new DataSet();
Table = null;

//Add Parameters
Command.Parameters.AddWithValue("param", "ID");
Command.ExecuteNonQuery();
adapter.SelectCommand = Command;
adapter.Fill(dataSet);
Table = dataSet.Tables[0];

它返回一个漂亮的表,其中 id = 1

我正在寻找这样的东西,请注意 FROM CLAUSE

query = "Select * From @tableName Where @param = 1";
OleDbCommand Command = new OleDbCommand(query, sqlConnStr);

DataTable Table = new DataTable();
DataSet dataSet = new DataSet();
Table = null;

//Add Parameters
Command.Parameters.AddWithValue("param", "ID");
Command.Parameters.AddWithValue("tableName", "Company");
Command.ExecuteNonQuery();
adapter.SelectCommand = Command;
adapter.Fill(dataSet);
Table = dataSet.Tables[0];

DBMS 不断返回"Error in From clause"

PS一切都拼写正确 - 我三重检查


致所有人 - 谢谢,但是我将坚持只使用参数化 SQL。我不喜欢 Dynamic SQLOne BIT

4

3 回答 3

2

您必须执行动态连接的 SQL 字符串,不幸的是,这会损害参数化 SQL 为您提供的任何好处。看到这个帖子

DECLARE @SQL varchar(250)
SELECT @SQL = 'Select * From ' + @TableName + ' Where ' + @param + ' = 1'
Exec(@SQL)

不建议使用,如果您可以通过其他方式预先确定表名。

于 2012-05-17T15:55:08.763 回答
1

SQL 不支持将 FROM 子句参数化。你不能按照你尝试的方式去做。也许你可以这样做:

query = "Select * From" + tableName + "Where @param = 1";
于 2012-05-17T15:59:31.753 回答
1

您不能使用参数化的对象名称。你将不得不做类似的事情

string.format("SELECT * FROM [{0}] WHERE [{1}] = 1", tableName, columnName);

这样做后果自负

检查输入中的方括号可能是值得的,这是我目前能想到的“注入”上述示例的唯一方法。我不是黑客,也不精通 sql 注入。像这样的东西可能会起作用:

        if (tableName.Contains("]"))
        {
            throw new ArgumentException();
        }
于 2012-05-17T16:01:42.083 回答