3

我有以下查询字符串

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id
= 0 && entity.Name LIKE @searchvalue ORDER BY @sorting SKIP @skip LIMIT @limit"

使用以下参数替换

query.Parameters.Add(new ObjectParameter("skip", start));
query.Parameters.Add(new ObjectParameter("limit", limit));
query.Parameters.Add(new ObjectParameter("searchvalue", searchValue + "%"));
query.Parameters.Add(new ObjectParameter("sorting", sortField + " " + sortDirection.ToUpper()));

但我总是以异常告终:

键表达式“ORDER BY”必须至少有一个对直接输入范围的引用。近 ORDER BY 子句项

我猜这发生了导致query.Parameters.Add(...)全部用引号括起来?我也读过这篇文章,但是如果什么都没有发生,我需要什么好处query.Parameters.Add(...)呢?好吧,攻击者可能不会开始新的查询,但我猜他可以操纵当前?

4

3 回答 3

3

猜想:我会尝试做这样的第一件事

SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id = 0 && entity.Name LIKE '@searchvalue' ORDER BY @sorting @sortorder SKIP @skip LIMIT @limit

query.Parameters.Add(new ObjectParameter("searchvalue", searchValue + "%"));
query.Parameters.Add(new ObjectParameter("sorting",   sortField ));
query.Parameters.Add(new ObjectParameter("sortorder", sortDirection));

换句话说:将排序顺序移动到分隔参数。

编辑

如果这不起作用,请使用查询生成器来构造查询。

例如看这里。

祝你好运。

于 2012-01-31T08:01:31.373 回答
0

已尝试删除引号@searchvalue,因为您使用的是参数化查询 IMO,因此不再需要引号。

代替:

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id
= 0 && entity.Name LIKE '@searchvalue' ORDER BY @sorting SKIP @skip LIMIT @limit"

试试这个:

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id
= 0 && entity.Name LIKE @searchvalue ORDER BY @sorting SKIP @skip LIMIT @limit"
于 2012-01-31T08:15:15.880 回答
0

您不能使用参数作为列名的替换。

于 2012-01-31T09:00:54.303 回答