Если быть точным, для клиента эта проблема не должна зависеть от языка, но я бы специально продемонстрировал эту проблему на 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_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
Мобильная версия