Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_match()在检查很长的字符串时以静默方式失败_Php_Zend Framework_Preg Match - Fatal编程技术网

Php preg_match()在检查很长的字符串时以静默方式失败

Php preg_match()在检查很长的字符串时以静默方式失败,php,zend-framework,preg-match,Php,Zend Framework,Preg Match,我正在我的一个项目中使用Zend Framework,文件Zend/Uri/Http.php有一个函数validateQuery,它使用preg_match验证给定的查询 它正常工作正常,但我有一个贝宝url查询字符串,非常长,大约1500个字符,preg\u match函数对此查询自动失败 我使用的是PHP版本。5.4.7因此,我没有pcre的限制。回溯限制=100000 现在我已经修改了Zendframework中的文件,不验证任何超过1000个字符的查询,但这显然不是正确的解决方案 在一个

我正在我的一个项目中使用Zend Framework,文件Zend/Uri/Http.php有一个函数validateQuery,它使用preg_match验证给定的查询

它正常工作正常,但我有一个贝宝url查询字符串,非常长,大约1500个字符,
preg\u match
函数对此查询自动失败

我使用的是PHP版本。5.4.7因此,我没有pcre的限制。回溯限制=100000

现在我已经修改了Zendframework中的文件,不验证任何超过1000个字符的查询,但这显然不是正确的解决方案

在一个注释之后,我尝试在一个独立页面中使用另一个带有preg_match的非常长的查询,我有相同的错误,我将我的测试数据粘贴到下面以供参考

$query = 'search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8&search?q=very+long+query+string+example&aq=f&oq=very+long+query+string+example&aqs=chrome.0.57j62l3.5553j0&sourceid=chrome&ie=UTF-8';

$pattern = "/^(?:%[[:xdigit:]]{2}|[A-Za-z0-9-_.!~*'()\[\];\/?:@&=+$,])*$/";

echo preg_match( $pattern, $query );
现在我已经修改了Zendframework中的文件,不验证任何超过1000个字符的查询,但这显然不是正确的解决方案

好吧,这对我来说并不是太错。1000个字符听起来像是一个合理的限制,允许URL输入,并拒绝所有比这更大的内容。而且,大型URL似乎利用验证器进行攻击,因此我将真正过滤它们,直到软件供应商修复了它们库中的这个缺陷


如果您发现了潜在的bug或缺陷,请向供应商咨询您的支持选项。由于这与验证相关,并且具有安全性影响,我很确定供应商会很高兴了解这个问题。

可能有一个超时……您应该向Zend报告这个问题,而不是(仅)在这里。因为正常的程序是与软件供应商讨论问题并在那里解决。如果您只是在ZF之外单独运行
preg_match()
,您是否也有同样的问题?如果是这样的话,你能编辑你的问题来包含这个例子吗?我刚刚在一个独立的php页面中尝试了pregmatch,但是我的查询结果是一样的,它失败了。但它可以很好地处理较短的查询。您的示例使用PHP5.4.6-1ubuntu1.2为我返回1。您可以检查您的返回值是0(不匹配)还是false(错误)?还要检查Apache错误日志中的PHP错误或分段错误。我认为这是一个糟糕的解决方案,因为我不应该修改框架的核心文件,除非它确实是一个问题,并且不能通过我自己的代码中的某些东西来修复。但是是的,如果在一个不可预见的问题的框架中有一个问题,那么在他们的代码中修复它似乎是好的。是的,你真的应该报告这个问题。向他们提供样本,以便他们重现问题。另请参阅Tim Fountain的评论,隔离问题并将隔离的演示添加到您的问题中。这会给你更多的反馈。