2013-04-25 27 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