1

我在我的一个项目中使用 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 );
4

1 回答 1

0

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

好吧,这对我来说听起来并不太错。1000 个字符听起来像是一个合理的限制,允许 URL 输入并拒绝大于该值的所有内容。大型 URL 似乎也利用了验证器,因此我真的会过滤掉它们,直到软件供应商在他们的库中修复了这个缺陷。

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

于 2013-04-25T13:42:47.077 回答