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();
}
}
只有基本的输入消毒?如果这不安全,我可采取哪些措施使其安全吗?
任何帮助是极大的赞赏。
过去几周我一直在研究这种情况,我找不到任何理由为什么它不安全,但这是一个如此模糊的问题(在一个我不熟悉的领域)我可能会失踪在该地区工作的任何人都会立即看到一些明显的根本问题。
FullTextQuery始终是只读的,因此您不必担心在处理SQL注入时可能需要考虑的人员丢弃表或类似问题。
但是,如果您对用户可以看到的数据有安全限制,则可能需要小心。
API还将操作限制为某些索引集 - 在您的情况下包含Poem实体的索引 - 因此也不可能突破所选索引。
但你需要考虑:
因此,为了保持安全意识,您可能希望:
FullTextFilter
以根据您的自定义规则限制用户查询。如果您非常偏执,请考虑任何全文索引实际上可以揭示某些术语在整个索引中的频率。人们通常不太关心这一点,因为它很难利用,只有最小的数据分布线索被揭示出来。
所以回到你的例子,如果这个索引只包含诗歌,你可以让任何用户看到你存储的任何一首诗,提供关于你提供哪些诗歌的线索通常不是安全问题,而是整个你的服务点。