首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContext ExecuteQuery

DataContext ExecuteQuery
EN

Stack Overflow用户
提问于 2012-08-20 08:20:50
回答 2查看 13.2K关注 0票数 4
代码语言:javascript
复制
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注入模式进行了验证?

谢谢你的指点!

EN

回答 2

Stack Overflow用户

发布于 2012-08-20 18:33:28

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

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

代码语言:javascript
复制
object[] param = new Object[] { "value1", "value2", "value3" };

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

代码语言:javascript
复制
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";

您似乎希望传递一个由三个XML值组成的参数。我不是XQuery专家,但是你可以试试这个:

代码语言:javascript
复制
object[] param = new Object[] { "''value1'', ''value2'', ''value3''" };
string query = @"SELECT ColA, ColXML FROM TableT WHERE ColXML.exist('/SuperNode/Node/SubNode[.=({0})]') = 1";
票数 3
EN

Stack Overflow用户

发布于 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参数,那么它就不能工作。

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

https://stackoverflow.com/questions/12031028

复制
相关文章

相似问题

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