Как предотвратить внедрение запросов в FT.SEARCH?Python

Программы на Python
Ответить
Anonymous
 Как предотвратить внедрение запросов в FT.SEARCH?

Сообщение Anonymous »

При использовании клиента redis-py для выполнения полнотекстового поиска по предоставленному пользователем запросу query_str (который имеет не формат аргумента запроса Redis, а сам текст для поиска) < strong>только для определенного текста поля на сервере Redis Stack, я боюсь, что использование интерполяции строк подвергнет меня риску внедрения запроса. Итак, как лучше всего избегать внедрения запросов в этом случае?
Если быть точным, для клиента эта проблема не должна зависеть от языка, но я бы специально продемонстрировал эту проблему на Python.

Код: Выделить всё

from redis import Redis
from redis.commands.search.query import Query

client = Redis.from_url("redis://localhost:6379")

def search_1(query_str: str):
query = Query(f"@text:{query_str}")
return client.ft("idx:test").search(query)

def search_2(query_str: str):
params = {"query_str": query_str}
query = Query("@text:$query_str").dialect(2)
return client.ft("idx:test").search(query, params)
В search_1() query_str объединяется непосредственно с аргументом запроса команды FT.SEARCH. Таким образом, предположим, что пользователь предоставил query_str = "query_for_text @other_field:query_for_other_field", фактическая выполненная команда будет выглядеть так FT.SEARCH "@text:query_for_text @other_field:query_for_other_field". Поэтому отклоняется от моей спецификации и выполняет поиск только по тексту поля, а также выполняет поиск по другому полю.
Я считаю, что search_2( ), решением этой проблемы является использование аргумента PARAMS функции FT.SEARCH. В документации FT.SEARCH относительно PARAMS указано, что

Каждая такая ссылка в поисковом запросе на имя параметра заменяется соответствующим значением параметра.

и

Вы не можете ссылаться на параметры в строка запроса, в которой не допускаются конкретные значения, например, в именах полей, @loc.

Хотя в документации это не очень подробно описано, я считаю, что под «заменой» не подразумевается интерполяция строк. , но весь конкретный параметр рассматривается как целая «фраза» для поиска, что также подтверждается моими экспериментами. Я хотел бы подтвердить, так ли это.
Я действительно изучил безопасность Redis и возможно ли запустить атаку с помощью инъекции строки по запросу Redis ?. Я считаю, что мой вопрос отличается от инъекции, которую предотвращает протокол Redis, которую я понимал как предотвращение внедрения в сообщение, которое клиент Redis отправляет на сервер (пользователь, помещающий escape-символ во входные данные, предполагает, что протокол Redis использует escape-символ, который это не так).
В проблеме Github, помимо использования PARAMS, есть также решения, которые вручную экранируют входной запрос query_str. Итак, как лучше всего справляться с несанкционированными пользовательскими данными, используемыми как часть запроса?

Подробнее здесь: https://stackoverflow.com/questions/789 ... -ft-search
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»