2012-01-31 5 views
3

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

+0

Не знаком с entity-sql, но я думаю, что да, он думает, что, например, 'fieldname asc' - это имя поля, которое вы хотите. Можете ли вы попробовать с помощью '... ORDER BY @sortfield @sortdir ...' и использовать два пакета? –

ответ

3

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

Выберите значение сущностей из сущности, как объекта WHERE entity.Client_id = 0 & & '@searchvalue' entity.Name LIKE ЗАКАЗАТЬ 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)); 

другими словами: перемещение порядок сортировки, чтобы отделить параметр.

EDIT

Если это не работает, использование Query Builder построить запрос.

Посмотрите, например, here.

Удачи.

+0

Это был мой первый ... Так что нет, это приводит к той же ошибке – sra

+0

@sra: ok, так что, наверное, это худший случай, когда вы не можете этого сделать. Но это должно быть возможно с построителем ObjectQuery. Посмотрите [здесь] (http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/6b95ad32-6642-4ec7-8051-e0bdfe022eff/) – Tigran

+0

вот и ответ! Вы должны скопировать это в нижней части своего ответа. – sra

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" 
+0

Я забыл об этом, вы абсолютно правы. Но тем не менее это не моя ошибка ... Я исправил это в своем посте.Но параметризует автоматическую цитату запроса? – sra

+0

При необходимости он автоматически применяет кавычки (например, при работе со строками). Нет необходимости включать параметр в кавычки. – CadentOrange

0

вы не можете использовать параметры как замена имен столбцов.

Смежные вопросы