让用户输入自定义正则表达式模式是否安全?

时间:2014-08-12 16:49:50

标签: regex postgresql groovy full-text-search

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

我希望用户不仅能够输入关键字,还能构成他们自己的正则表达式模式,系统将使用这些模式来搜索内容。自定义正则表达式模式将属性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进行全文搜索会更好吗?它是否提供正则表达式?

1 个答案:

答案 0 :(得分:0)

在一个天真的实施中,不,它不安全。人们可以对名为ReDoS的正则表达式执行攻击。您还可以在OWASP上阅读有关它的更多信息。这是通过消耗计算资源来完成的拒绝服务,这可能会阻止其他请求被响应。

如果使用statement_timeout限制正则表达式执行时间,可以阻止ReDoS,可以使用set statement_timeout to 10000进行设置。将10000替换为与您的环境更相关的超时。

您还可以考虑使用LIKE运算符根据关键字进行选择。基于关键字进行搜索通常比正则表达式更加用户友好,并且您不必担心设置超时。

相关问题