让用户通过正则表达式查询是一个好主意吗?

时间:2012-10-17 10:37:56

标签: php regex security

  

可能重复:
  Sanitization of User-Supplied Regular Expressions in PHP

假设您希望让用户搜索某些内容,并且您的搜索功能可以接受正则表达式。

让网站用户通过他们发布的正则表达式进行搜索是否可以?从用户的角度来看,我喜欢一个可以让我这样做的网站:D

是否涉及任何安全风险?我如何消毒正则表达式?

3 个答案:

答案 0 :(得分:2)

主要风险是正则表达式非常复杂并且将运行很长时间或达到引擎的递归限制。 See this article.如果您让用户在错误的位置使用正则表达式替换,可能会出现其他风险,因为这会引入代码注入的风险。但是匹配本身并不会对DoSing你的服务器造成任何其他伤害。

最近有一个关于如何识别这些危险的正则表达式的问题,并且一致认为通常不可能。 See the question.

你可能最好限制你的正则表达式搜索可以采取的时间,如果花费太长时间就中止它。

答案 1 :(得分:2)

我没有看到直接的安全风险,但我发现性能相关的问题很容易导致严重的停机时间。这有两种口味,太复杂而且太宽泛。考虑一下像.*这样的查询 - 有一个大型数据库,我已经看到,即使是其中的一些也很容易打倒系统。

我会使用除实际实时数据库之外的其他内容来执行用户搜索,最好是从内存中的缓存结果开始,这应该不重要。

或者只是实现注释(*,?)中建议的通配符。它们更加用户友好,更容易处理。

答案 2 :(得分:1)

如果正则表达式不影响编程代码,则没有真正的安全风险。我相信,它通常没有实现的原因是它是一个昂贵的过程,我从未见过它在SQL中使用过,所以你需要获取所有搜索到的内容,然后在其上运行正则表达式,而不是比SQL like或完全匹配等允许的简单性