实体SQL和SQL注入

时间:2012-01-31 07:48:34

标签: c# entity-framework sql-injection entity-sql

我有以下查询字符串

"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(...)?好吧,攻击者可能无法启动新查询,但我猜他可以操纵当前的?

3 个答案:

答案 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)

您无法使用参数替换列名。