Php 让用户通过regex查询是个好主意吗?

Php 让用户通过regex查询是个好主意吗?,php,regex,security,Php,Regex,Security,可能重复: 假设您希望让用户搜索某些内容,并且您的搜索函数能够接受正则表达式 允许站点用户通过他们发布的正则表达式进行搜索可以吗?从用户的角度来看,我希望有一个网站能让我做到这一点:d 是否存在任何安全风险?如何清理正则表达式?主要风险是正则表达式非常复杂,会运行很长时间或达到引擎的递归限制。如果您让用户在错误的位置使用regex替换,则可能会发生其他风险,因为这会引入代码注入的风险。但是,匹配本身并不能真正造成任何伤害,除了给服务器添加剂量 最近有一个关于如何识别这些危险正则表达式的问题,人

可能重复:

假设您希望让用户搜索某些内容,并且您的搜索函数能够接受正则表达式

允许站点用户通过他们发布的正则表达式进行搜索可以吗?从用户的角度来看,我希望有一个网站能让我做到这一点:d


是否存在任何安全风险?如何清理正则表达式?

主要风险是正则表达式非常复杂,会运行很长时间或达到引擎的递归限制。如果您让用户在错误的位置使用regex替换,则可能会发生其他风险,因为这会引入代码注入的风险。但是,匹配本身并不能真正造成任何伤害,除了给服务器添加剂量

最近有一个关于如何识别这些危险正则表达式的问题,人们的共识是这通常是不可能的


您最好限制正则表达式搜索所需的时间,如果搜索时间过长,则终止搜索。

主要风险是正则表达式非常复杂,会运行很长时间或达到引擎的递归限制。如果您让用户在错误的位置使用regex替换,则可能会发生其他风险,因为这会引入代码注入的风险。但是,匹配本身并不能真正造成任何伤害,除了给服务器添加剂量

最近有一个关于如何识别这些危险正则表达式的问题,人们的共识是这通常是不可能的


您最好限制正则表达式搜索所需的时间,如果搜索时间太长,则中止搜索。

如果正则表达式不影响编程代码,则没有真正的安全风险。我认为,它通常没有实现的原因是,这是一个代价高昂的过程,而且我从未在SQL中使用过它,因此您需要获取所有正在搜索的内容,然后在其上运行正则表达式,而不是SQL
之类的
或精确匹配所允许的简单性,等等。

如果正则表达式不影响编程代码,就没有真正的安全风险。我认为,它通常没有实现的原因是,这是一个代价高昂的过程,而且我从未在SQL中使用过它,因此您需要获取所有正在搜索的内容,然后在其上运行正则表达式,而不是SQL
之类的
或精确匹配所允许的简单性,等等。

我没有看到直接的安全风险,但我看到与性能相关的问题很容易导致严重的停机。这有两种口味,太复杂和太宽泛。例如,考虑一个查询,如<代码> *>代码>用一个大的数据库,我已经看到,即使是其中的一些也可以很容易地降低系统。 我将使用实际的实时数据库以外的其他内容执行用户搜索,最好是从内存中的缓存结果执行搜索,在内存中这应该没有多大关系


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

我没有看到直接的安全风险,但我看到与性能相关的问题很容易导致严重的停机。这有两种口味,太复杂和太宽泛。例如,考虑一个查询,如<代码> *>代码>用一个大的数据库,我已经看到,即使是其中的一些也可以很容易地降低系统。 我将使用实际的实时数据库以外的其他内容执行用户搜索,最好是从内存中的缓存结果执行搜索,在内存中这应该没有多大关系


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

嗯,许多数据库都有一个like运算符,它也允许使用正则表达式,使用一个单独的关键字。如果我理解正确的话,你从未见过这样的事情吗?好吧,在MySQL中,
regexp
,但据我所知,它不允许regex的全部功能。还有和。。。我所知道的唯一一个没有它们的是MSSQL.um,很多数据库都有一个like操作符,它也允许正则表达式,使用一个单独的关键字。如果我理解正确的话,你从未见过这样的事情吗?好吧,在MySQL中,
regexp
,但据我所知,它不允许regex的全部功能。还有和。。。我所知道的唯一一个没有它们的是MSSQL。我认为允许用户使用通配符(*和?)进行搜索是一个更好的主意,它更容易实现,而且对资源更友好。不过通配符也有危险,如果你不小心,它们也会消耗你的资源。但我同意这个理由。我认为允许用户使用通配符(*和?)进行搜索是一个更好的主意,它更容易实现,而且对资源更友好。不过通配符也有危险,如果你不小心,它们也会消耗你的资源。但我同意这个理由。