Regex 允许用户输入自定义正则表达式模式安全吗?

Regex 允许用户输入自定义正则表达式模式安全吗?,regex,postgresql,groovy,full-text-search,Regex,Postgresql,Groovy,Full Text Search,我有一个应用程序,它将文本文件作为输入,从中解析文本并将其存储在数据库中。在此之后,用户可以查找某些关键字,查看它们是否与上载的文本文件中的任何文本匹配 我希望用户不仅能够输入关键字,还能够创建自己的正则表达式模式,系统将使用这些模式来搜索内容。自定义正则表达式模式的属性isRegex将设置为true 因此,我在代码中搜索文本,如下所示: if (keyword.isRegex) { if (text ==~ /${keyword}/) { m = text =~ /${keyword}

我有一个应用程序,它将文本文件作为输入,从中解析文本并将其存储在数据库中。在此之后,用户可以查找某些关键字,查看它们是否与上载的文本文件中的任何文本匹配

我希望用户不仅能够输入关键字,还能够创建自己的正则表达式模式,系统将使用这些模式来搜索内容。自定义正则表达式模式的属性
isRegex
将设置为true

因此,我在代码中搜索文本,如下所示:

if (keyword.isRegex) {
 if (text ==~ /${keyword}/) {
   m = text =~ /${keyword}/
   m.each {println "Found ${it}"
 }
}
else {
 if (text ==~ /\b${keyword}\b/) {
   m = text =~ /\b${keyword}\b/
   m.each {prinltn "Found ${it}"
 }
}
问题

  • 允许用户输入自己的自定义正则表达式安全吗?如果没有,我可以采取什么措施来避免安全问题
  • 我找到文本的方法行吗?我知道有全文搜索解决方案或数据库,但我不需要它们提供的所有功能。使用PostgreSQL进行全文搜索会更好吗?它是否提供正则表达式

在一个简单的实现中,不,它是不安全的。有一种攻击,人们可以对称为。你也可以在上阅读更多关于它的信息。这是一种通过消耗计算资源实现的拒绝服务,这可能会阻止其他请求得到响应

如果使用
statement\u timeout
限制正则表达式的执行时间,则可以防止重做,可以使用
set statement\u timeout设置为10000
。将
10000
替换为与您的环境更相关的超时


您也可以考虑使用<代码>类似于< /Cult>运算符来基于关键字进行选择。基于关键字的搜索通常比正则表达式更方便用户,而且您不必担心设置超时。

最终用户如何知道正则表达式模式?你在训练他们吗?假设他们知道如何写正则表达式。此功能将只提供给非常选定的用户(4或5),在这种情况下,请在其旁边提供一些帮助内容或链接。仍然需要验证每个正则表达式模式。你不能相信它。但是如果我像操作符一样使用
,那么用户就不能输入他们自己的正则表达式模式,对吗?正确。它是一种替代品,但不是替代品。正如我上面所说的,如果限制正则表达式的执行时间,那么它将减轻攻击向量。只需设置一个<代码> StestMyTimeOuts< /COM>通常就足以应付ReDoS等。