EntitySQL и SQL-инъекция - PullRequest
       40

EntitySQL и SQL-инъекция

3 голосов
/ 31 января 2012

У меня есть следующая строка запроса

"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(...), если ничего не происходит?ОК, злоумышленник не может начать новый запрос, но я думаю, что он может манипулировать текущим?

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Guess: Первым делом я попробовал бы сделать что-то вроде этого

ВЫБЕРИТЕ ЗНАЧЕНИЕ сущности ИЗ СУЩНОСТИ КАК СУЩНОСТЬ, ГДЕ 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));

Другими словами: переместите порядок сортировки к разделенному параметру.

РЕДАКТИРОВАТЬ

Если это не работает, используйте Query Builder для построения запроса.

Посмотрите здесь например.

Удачи.

0 голосов
/ 31 января 2012

Нельзя использовать параметры для замены имен столбцов.

0 голосов
/ 31 января 2012

Попытался удалить кавычки @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"
...