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注入模式进行了验证?
谢谢你的指点!
发布于 2012-08-20 18:33:28
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";发布于 2015-07-27 15:30:56
对于像我一样通过谷歌偶然发现这一点的任何人,ExecuteQuery不会简单地将命令和参数传递给string.Format,因为那样会产生注入漏洞。
它取代了{0},{1},...在命令中使用"@p0“、"@p1”等,然后将参数作为参数添加到sql命令中。这可以通过在数据上下文上设置.Log属性来确认,以查看实际执行的命令。
所以OP的例子不起作用,因为f(x)其中x= "a,b,c“只有在我们进行简单的字符串替换时才等同于f(a,b,c)。如果x是一个“合适的”SQL参数,那么它就不能工作。
https://stackoverflow.com/questions/12031028
复制相似问题