Экранировать специальные символы в запросе Solr при поиске по полям? - PullRequest
0 голосов
/ 27 июня 2019

Solr Query: fooField:foovalue OR barField:barValue

Этот запрос может быть переопределен в браузере, что может привести к потенциальным атакам с использованием инъекций.Но экранирование специальных символов, таких как : и пробелов, не дает ожидаемого результата.

Есть ли способ избежать запроса и выполнить поиск по полям solr для получения желаемых результатов?

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Для предотвращения атаки с использованием инъекций в этом контексте, учитывая, что строка запроса может быть переопределена, вам необходимо соответствующим образом отфильтровать вводимые пользователем данные:

  • Веб-сервер должен отображать форму поиска, которая должнапройти валидацию перед тем, как сделать запрос Solr.Эта форма, независимо от ввода (-ий) в пользовательском интерфейсе, не должна принимать строку запроса для прямой передачи в Solr после ее отправки, а должна обрабатывать и проверять несколько входных полей:

    ?fieldA=terms&fieldb=otherterms
    
  • Пользователи не должны иметь возможность поиска по произвольным именам полей: в обработчике проверки вам нужно проверить, действительно ли fieldname доступен для поиска.Это означает, например, что если [fieldA, fieldB, fieldC] являются единственными полями, в которых пользователи могут законно сделать запрос, все, кроме этих полей, следует отбрасывать:

    ?fieldA=terms&inject:ed=willBeDiscarded
    

Если вам нужно, чтобы пользователиуметь искать разные значения в разных полях - если вы не можете использовать qf - пользовательский интерфейс может помочь различать двоеточие в field:<terms> и двоеточие в field:<termsContainingColon>, в этом случае вам может потребоваться один входной текст для полей поиска, так что пользовательский ввод чисто ограничен значением каждого поля.

0 голосов
/ 27 июня 2019

Обработчик запроса edismax создан для подобных ситуаций - если вы не хотите, чтобы пользователь мог самостоятельно присоединять имена полей, используйте qf, чтобы сообщить Solr, какие поля ему следует искать, а затем экранировать запроси отправьте его в параметре q в виде необработанного текста.

Если вы do хотите искать разные значения в разных полях, вам придется экранировать каждое значение и ставить перед ним префиксимя поля, как вы показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...