4
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";
string param = "''value1'',''value2'',''value3''";
string sQ = string.Format(query, param);

A: dbContext.ExecuteQuery(sQ);

B: dbContext.ExecuteQuery(query, param);

A 执行并返回结果,但 B 没有。

这有什么原因吗?此外,参数是否针对常见的SQL注入模式进行了验证?

感谢您的任何指点!

4

2 回答 2

3

http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery.aspx

您正在尝试使用接收参数的 ExecuteQuery 的重载版本。参数必须作为对象数组传递,例如:

object[] param = new Object[] { "value1", "value2", "value3" };

无论如何,您的查询只接收一个参数:

string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";

您似乎想传递由三个 xml 值组成的单个参数。我不是 XQuery 专家,但您可以试试这个:

object[] param = new Object[] { "''value1'', ''value2'', ''value3''" };
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";
于 2012-08-20T10:33:27.853 回答
1

对于像我一样通过谷歌偶然发现的任何人,ExecuteQuery 不会简单地将命令和参数传递给 string.Format,因为这会产生注入漏洞。

它将命令中的 {0}、{1}、... 替换为“@p0”、“@p1”等,然后将您的参数作为参数添加到 sql 命令中。这可以通过在数据上下文中设置 .Log 属性以查看实际执行的命令来确认。

因此,OP 的示例不起作用,因为 f(x) where x = "a,b,c" 仅在我们进行简单的字符串替换时才等效于 f(a,b,c) 。如果 x 是“正确”的 SQL 参数,则它不起作用。

于 2015-07-27T07:30:55.847 回答