c#在表名上使用OleDbParameter

本文关键字:OleDbParameter | 更新日期: 2023-09-27 18:01:46

我想保护我的应用程序从SQL注入。我想在SQL查询表名({1})中使用OleDbParameter。

问题是它不起作用(FROM或类似的错误)。我可以在{3}中传递OleDbParameter。例子:

IDbCommand cmd = m_oConnection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = String.Format("SELECT {0} FROM {1} WHERE {2}={3}",
                "ParentID",
                "?",
                sWhere,
                "?"
);
cmd.Parameters.Add(new OleDbParameter("@sTable", sTable));
cmd.Parameters.Add(new OleDbParameter("@id", id));

我能做什么?我是否被迫写一个函数来转义一些SQL字符的手?如果是,我在哪里可以找到一个完美的函数?

谢谢

c#在表名上使用OleDbParameter

表名不能参数化但可以这样

cmd.CommandText = String.Format("SELECT {0} FROM [{1}] WHERE {2}={3}",
                "ParentID",
                sTable,
                sWhere,
                "?"

但是当且仅当sTable来自用户输入时,这是危险的。如果你直接控制sTable,你就不用担心了。

如果它确实来自用户输入,你需要保护自己。最简单的方法是确保sTable是一个有效的表、附加表或查询名称

只需执行

 SELECT Name FROM Myssobjects Where Type in (1,5,6,)  

获取sTable的有效值列表。

根据你的应用程序,你可能只执行一次并缓存结果,这样你就不必每次调用这个方法都这样做。

您需要使用动态sql来生成您的命令。

但是当你传入表名时,很容易在参数中嵌入SQL字符串,但这不是很好。

看:http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx