preg_match()在检查一个很长的字符串时无声地失败

时间:2013-04-25 13:36:32

标签: php zend-framework preg-match

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

它正常工作正常,但我有一个非常长的paypal url查询字符串,大约1 500个字符,preg_match函数无声地为此查询失败。

我正在使用PHP版本。 5.4.7因此我没有pcre.backtrack_limit = 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 );

1 个答案:

答案 0 :(得分:0)

  

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

嗯,这对我来说不是错了。 1000个字符听起来像一个理智的限制,允许URL输入和拒绝大于此的一切。大型URL似乎也利用了验证器,因此我会真正过滤它们,直到软件供应商修复了它们库中的这个缺陷。

检查供应商是否有支持选项,以了解您发现潜在错误或缺陷的情况。由于这与验证有关并且具有安全隐患,因此我非常确定供应商会很乐意了解这个问题。