SQL -подобная инъекция в фильтрах - PullRequest
1 голос
/ 09 января 2020

Я строю этот метод, который позволяет построить SearchParameters объект. Один из методов позволяет указать Filter поле этого объекта. Это выглядит так (упрощенная версия)

public SearchParameters CreateWithFilter(string fieldName, string operator, string value)
{
    var filterString = $"{fieldName} {operator} '{value}'";

    return new SearchParameters{ Filter = filterString };
}

, поэтому я могу использовать его вот так

var searchParameters = this.CreateWithFilter("manufacturer", "eq", "volvo");

Теперь проблема в том, что этот код sql -инъекция -подобно уязвимо. Если я позвоню

var searchParameters = this.CreateWithFilter("manufacturer", "eq", "volvo' or someField eq 1 or manufacturer eq 'volvo");

Я стану великим Azure Поисковый хакер;)

Мой вопрос:

Есть ли какие-либо специфические c методы в Azure Поиск, подобные тем, которые известны из SQL мира, которые позволили бы мне защитить код от этих типов инъекций?

1 Ответ

2 голосов
/ 09 января 2020

Замечательно, если вы берете строки из внешних / ненадежных источников, создание строки запроса с ними никогда не безопасно.

В SQL рекомендуемый подход заключается в использовании параметризованных запросов, когда это возможно (например, SELECT * FROM таблицы, ГДЕ поле> @param). К сожалению, Azure Поиск не имеет параметров в таких запросах.

Альтернативный подход для Azure Поиск - тщательно избегать специальных символов, которые позволяют вводить. Простой отправной точкой является:

  1. Для строковых полей экранируйте одинарные кавычки (повторяйте кавычки).
  2. Для чисел, логических значений и дат полностью проанализируйте литерал (например, с помощью int.parse, float.parse, bool.parse и т. Д. c.) И преобразуйте его в строку перед добавлением в фильтр. Это не только помогает с внедрением, но также позволяет вам принимать входные данные в локалях и форматах, отличных от того, что предполагает OData (например, "," против "." В качестве десятичных разделителей, форматов даты и т. Д. c.).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...