У меня здесь немного плохая ситуация. Я застрял, работая с коммерческим сервером, который не выполняет большую часть очистки / параметризации.
Я пытаюсь создать свои запросы для предотвращения SQL-инъекций, однако некоторые вещи, такие как условие search / where для объекта поиска, должны быть собраны, и нет параметризованного интерфейса.
В принципе, я не могу параметризовать, однако я надеялся, что смогу использовать тот же движок, чтобы СТРОИТЬ мой текст запроса, если это возможно. Есть ли способ сделать это, кроме написания моего собственного механизма параметризации, который, вероятно, все еще будет не так хорош, как параметризованные запросы?
Обновление: пример
Предложение where должно быть построено как SQL-запрос, где предложение по существу:
CatalogSearch search = /// Create Search object from commerce server
search.WhereClause = string.Format("[cy_list_price] > {0} AND [Hide] is not NULL AND [DateOfIntroduction] BETWEEN '{1}' AND '{2}'", 12.99m, DateTime.Now.AddDays(-2), DateTime.Now);
* Приведенный выше пример показывает, как вы уточняете поиск, однако мы провели некоторое тестирование, эта строка НЕ САНИТИЗИРОВАНА .
В этом и заключается моя проблема, потому что любой из этих входных данных в .Format может быть пользовательским, и хотя я могу легко очистить свой ввод из текстовых полей, я пропущу крайние случаи, это просто природа вещей. У меня нет возможности использовать параметризованный запрос, потому что в Commerce Server есть какая-то безумная обратная логика в том, как он обрабатывает расширяемый набор полей (схему), а слова для поиска в свободном тексте где-то предварительно скомпилированы. Это означает, что я не могу перейти непосредственно к таблицам sql
То, что я хотел бы / люблю / видеть, это что-то вроде:
SqlCommand cmd = new SqlCommand("[cy_list_price] > @MinPrice AND [DateOfIntroduction] BETWEEN @StartDate AND @EndDate");
cmd.Parameters.AddWithValue("@MinPrice", 12.99m);
cmd.Parameters.AddWithValue("@StartDate", DateTime.Now.AddDays(-2));
cmd.Parameters.AddWithValue("@EndDate", DateTime.Now);
CatalogSearch search = /// constructor
search.WhereClause = cmd.ToSqlString();