Параметризованные запросы / Без / с использованием запросов
У меня здесь немного плохая ситуация. Я застрял, работая с коммерческим сервером, который не выполняет большую часть очистки / параметризации.
Я пытаюсь создать свои запросы для предотвращения 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();
1 ответ
Похоже, вам придется пройти старую школу и самостоятельно проверить данные, прежде чем создавать запрос. Я не парень.NET, но в мире CGI я бы очистил входные данные чем-то вроде:
$foo =~ s/[^a-zA-Z0-9*%]//g
Это помешает любой инъекции SQL, о которой я только подумаю, и разрешит использование подстановочных знаков. Единственная проблема в том, что регулярные выражения дорогие.