我想保护我的应用程序免受SQL注入。我要在表名称({1})的SQL查询中使用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字符?如果是,我在哪里可以找到一个完美的函数?
谢谢
发布于 2011-07-08 23:42:16
因此,您知道不能将表名参数化,但可以这样做
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的有效值列表,请执行以下操作。
根据应用程序的不同,您可能只执行一次并缓存结果,这样就不必每次调用此方法时都执行此操作。
发布于 2011-07-08 22:21:45
您将需要使用动态sql来生成命令。
但是,当您传入表名时,很容易在参数中嵌入sql字符串,但这并不好。
请参阅:http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx
‘放入参数中的任何内容都将被视为字段数据,而不是SQL语句的一部分。’
https://stackoverflow.com/questions/6625724
复制相似问题