首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -对表名使用OleDbParameter

C# -对表名使用OleDbParameter
EN

Stack Overflow用户
提问于 2011-07-08 22:15:03
回答 2查看 1.5K关注 0票数 1

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

问题是它不工作( FROM中的错误或类似的错误)。我可以传递{3}思想中的OleDbParameter。示例:

代码语言:javascript
复制
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字符?如果是,我在哪里可以找到一个完美的函数?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-08 23:42:16

因此,您知道不能将表名参数化,但可以这样做

代码语言:javascript
复制
cmd.CommandText = String.Format("SELECT {0} FROM [{1}] WHERE {2}={3}",
                "ParentID",
                sTable,
                sWhere,
                "?"

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

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

要做到这一点,只需执行

代码语言:javascript
复制
 SELECT Name FROM Myssobjects Where Type in (1,5,6,)  

若要获取sTable的有效值列表,请执行以下操作。

根据应用程序的不同,您可能只执行一次并缓存结果,这样就不必每次调用此方法时都执行此操作。

票数 2
EN

Stack Overflow用户

发布于 2011-07-08 22:21:45

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

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

请参阅:http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

‘放入参数中的任何内容都将被视为字段数据,而不是SQL语句的一部分。’

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6625724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档