Безопасно ли передавать строку запроса Lucene непосредственно от пользователя в QueryParser? - PullRequest
0 голосов
/ 14 февраля 2019

tldr: Могу ли я безопасно передать необработанную строку запроса (полученную в виде параметра URL) в Lucene QueryParser без какой-либо дополнительной очистки входных данных?

Я не эксперт по безопасности, но мне нужен совет.Как говорится в заголовке, безопасно ли использовать этот метод контроллера:

    @CrossOrigin(origins = "${allowed-origin}")
    @GetMapping(value = "/search/{query_string}", produces = MediaType.APPLICATION_JSON_VALUE)
    public List doSearch(@PathVariable("query_string") String queryString) {
        return searchQueryHandlerService.doSearch(queryString);
    }

В тандеме с этим методом обслуживания (обработка ошибок предназначена только для тестирования):

    public List doSearch(String queryString) {
        LOGGER.debug("Parsing query string: " + queryString);
        try {
            Query q = new QueryParser(null, standardAnalyzer).parse(queryString);
            FullTextEntityManager manager = Search.getFullTextEntityManager(entityManager);
            FullTextQuery fullTextQuery = manager.createFullTextQuery(q, Poem.class, Book.class, Section.class);
            return fullTextQuery.getResultList();
        } catch (ParseException e) {
            LOGGER.error(e);
            return Collections.emptyList();
        }
    }

Только сбазовая дезинфекция?Если это небезопасно, могу ли я принять меры, чтобы сделать это безопасным?

Любая помощь с благодарностью.

Я изучал это время от времени в течение последних нескольких недель, и я не могу найти причину, по которой это не будет безопасным, но это такой неясный вопрос (вобласти, с которой я не знаком), что я могу упустить какую-то очевидную, фундаментальную проблему, которую каждый, кто работает в этой области, сразу увидит.

1 Ответ

0 голосов
/ 15 февраля 2019

A FullTextQuery всегда доступен только для чтения, поэтому вам не нужно беспокоиться о том, что люди отбрасывают таблицы, или о подобных проблемах, которые могут возникнуть при работе с SQL-инъекцией.

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

API также ограничивает работу определенным набором индексов - в вашем случае те, которые содержат сущности Poem -так что также невозможно вырваться из выбранных индексов.

Но вы должны учитывать:

  • все в порядке, если пользователь может каким-то образом найти другое стихотворение, чем то, чтовы ожидали, что они будут искать
  • , если вы будете использовать один и тот же индекс с другими объектами, возможно, есть несколько способов вывести данные об этих других объектах

Так что для обеспечения безопасности вы могли быхочу:

  • каждый тип сущности индексируется в свой собственный индекс (по умолчанию).
  • позволяет некоторым FullTextFilter ограничиватьпользовательский запрос, основанный на ваших пользовательских правилах.
  • фактически проверяет содержимое каждого результата перед его рендерингом, чтобы удалить содержимое, которое другие фильтры не перехватили.

Если выкрайне параноидально, учтите, что любой полнотекстовый индекс может немного рассказать о том, как часто определенные термины встречаются во всем индексе.Люди, как правило, не слишком обеспокоены этим, поскольку им чрезвычайно трудно воспользоваться, и раскрываются лишь минимальные подсказки о распределении данных.

Итак, вернемся к вашему примеру, если этот индекс содержит только стихи и выХорошо, если вы позволите любому пользователю просматривать любое сохраненное вами стихотворение, и раздача подсказок о том, какие стихотворения вы делаете доступными, обычно не является проблемой безопасности, а скорее всего суть вашего служения.

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