2013-04-25 107 views
1

我在我的一个项目中使用Zend Framework,文件Zend/Uri/Http.php有一个函数validateQuery,它使用preg_match验证给定的查询。preg_match()检查一个很长的字符串时会失败默默无闻

它正常工作正常,但我有一个PayPal网址查询字符串,这是非常长,约1500字符和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); 
+0

也许有一个超时... – 2013-04-25 13:39:08

+0

你应该向Zend报告这个问题,而不是(仅)在这里。因为正常的程序是与软件供应商讨论问题并在那里解决问题。 – hakre 2013-04-25 13:39:16

+2

如果你只是在ZF之外自己运行'preg_match()',你是否也有同样的问题?如果是这样,你可以编辑你的问题,包括该例子? – 2013-04-25 13:40:53

回答

0

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

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

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

+0

我认为这是一个不好的解决方案,因为我不应该修改框架的核心文件,除非它真的存在问题,并且无法通过我自己的代码中的某些东西修复。但是,如果在一个无法预料的问题的框架内出现问题,那么在代码中修复它似乎是好的。 – 2013-04-25 13:56:50

+0

是的,你应该真的报告这个问题。向他们提供样品,以便他们能够重现问题。 – hakre 2013-04-25 13:57:35

+0

另请参阅* Tim Fountain *的评论,分离问题并将孤立的演示添加到您的问题中。这会给你更多关于SO的反馈。 – hakre 2013-04-25 13:58:57