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不执行。
有什么理由吗?此外,param是否针对常见的SQL
注入模式进行了验证?
感谢您的任何指示!
答案 0 :(得分:3)
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.executequery.aspx
您正在尝试使用接收参数的重载版ExecuteQuery。参数必须作为Object数组传递,例如:
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";
答案 1 :(得分:1)
对于像我这样通过谷歌绊倒的人,ExecuteQuery不会简单地将命令和参数传递给string.Format,因为这会产生注入漏洞。
它用" @ p0"," @ p1"取代命令中的{0},{1},...等,然后将您的参数作为参数添加到sql命令。这可以通过在数据上下文中设置.Log属性来查看实际执行的命令来确认。
所以OP的例子不起作用,因为 f(x)其中x =" a,b,c" 只相当于 F(A,B,C) 如果我们正在做一个简单的字符串替换。如果x是"正确的" SQL参数然后它不起作用。