我有以下查询字符串
"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(...)
包含所有引号?我也读过this但是为了什么好处,如果什么都不发生,我需要query.Parameters.Add(...)
?好吧,攻击者可能无法启动新查询,但我猜他可以操纵当前的?
答案 0 :(得分:3)
猜测: 首先我会尝试做这样的事情
SELECT VALUE实体FROM实体AS实体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));
换句话说:将排序顺序移动到seprated参数。
编辑
如果这不起作用,请使用Query Builder构建查询。
以here为例。
祝你好运。答案 1 :(得分: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"
答案 2 :(得分:0)
您无法使用参数替换列名。