2

我有一个命中 java 应用程序 (SOLR) 的查询。

查询的一种特定模式就像

http:server:port/app/select?q=(skunum:(2809553163000\+OR+09552883000\+OR+09553124000\))

如果您注意到每个项目编号的末尾都有一个转义字符。

我需要阻止此类查询访问我的应用程序。

我只需要知道如何识别这些特定查询?有没有模式匹配子句?

4

1 回答 1

1

从根本上看,问题似乎是确定一个字符串(在这种情况下是 URL 查询字符串)是否包含一组字符(转义字符)中的任何一个。我可以想到两种方法。一种是使用正则表达式

// ignore queries containing a, b, or c in the query string
if (url.getQuery().matches("[abc]"))
{
    // ignore query
}

另一种方法是使用一个函数来遍历一个字符串以查找给定集合中的字符。我在这里bool ContainsAny(String, char[])找到了一个示例方法。正则表达式是一种更通用的解决方案(使用起来有点棘手,尤其是对于新手而言),但这种方法在这种情况下也足够了。ContainsAny()

更大的问题是输入验证。这不仅对正确的应用程序功能很重要,而且对安全性也很重要。尽一切可能采取任何措施来确保您处理的所有查询都符合您的规范并包含有意义的值。寻找 Java 或 SOLR 提供的 API 来促进这一点。

最后一点:在您提供的示例中,我不清楚其中是否存在真正的“转义”。我在每个数字后看到反斜杠 ( \),但这些不一定是转义,因为 (+和) 后面的字符)不需要转义。实际上,URL 中的空格通常映射到+字符或%20.

于 2013-02-27T01:16:16.240 回答