पीसीआर सीमाएं क्या हैं?


11

ModSecurity में PCRE limits exceededत्रुटियाँ हैं।

मुझे पता है कि मैं इस तरह के नियम निर्धारित करके इसे ठीक कर सकता हूं:

SecPcreMatchLimit 150000
SecPcreMatchLimitRecursion 150000

लेकिन, ये नियम वास्तव में क्या कर रहे हैं? 150,000 के लिए PCRE सीमा पुनरावृत्ति का क्या अर्थ है? इन उच्चकोटि को सेट करके मैं किस सुरक्षा छेद की अनुमति दे रहा हूँ? क्या recursionऔर क्या limitमतलब है?

मुझे पता है कि प्रलेखन है, लेकिन प्रलेखन वास्तव में मुझे नहीं बता रहा है कि क्या चल रहा है, यह मुझे निर्देश के साथ काम करने का तरीका बताता है।


मैं इस पोस्ट को "pcre" में "perl" टैग बदलने के लिए संपादित कर रहा हूं। PCRE पर्ल नहीं है, इसके बावजूद कि आपको क्या विश्वास करना होगा।
एंडी लेस्टर

जवाबों:


13

ये किसी पाठ को किसी पैटर्न से मिलाने की कोशिश में खर्च की गई अधिकतम मात्रा की स्मृति / समय को सीमित करने के लिए PCRE इंजन की आंतरिक सेटिंग्स प्रतीत होती हैं। pcreapi मैनपेज आम आदमी की दृष्टि में यह समझाने के लिए थोड़ा करता है:

Match_limit फ़ील्ड PCRE को संसाधनों की एक बड़ी मात्रा का उपयोग करने से रोकने का एक साधन प्रदान करता है जब चलने वाले पैटर्न जो मैच नहीं कर रहे हैं, लेकिन जिनके खोज पेड़ों में बहुत बड़ी संख्या में संभावनाएं हैं। क्लासिक उदाहरण नेस्टेड असीमित दोहराव का उपयोग है।

आंतरिक रूप से, PCRE एक फ़ंक्शन का उपयोग करता है जिसे मैच कहा जाता है () जिसे वह बार-बार कॉल करता है (कभी-कभी पुनरावर्ती)। मैच_लिमिट द्वारा निर्धारित की गई सीमा को एक मैच के दौरान कॉल करने की संख्या पर लगाया जाता है, जिस पर लगने वाले बैकट्रैकिंग की मात्रा को सीमित करने का प्रभाव पड़ता है। उन पैटर्न के लिए जिन्हें एंकर नहीं किया गया है, गिनती विषय स्ट्रिंग में प्रत्येक स्थिति के लिए शून्य से पुनरारंभ होती है।

सीमा के लिए डिफ़ॉल्ट मान तब सेट किया जा सकता है जब पीसीआरई बनाया जाता है; डिफ़ॉल्ट डिफ़ॉल्ट 10 मिलियन है, जो सभी लेकिन सबसे चरम मामलों को संभालता है। आप एक pcre_extra ब्लॉक के साथ pcre_exec () को दबाकर डिफ़ॉल्ट को ओवरराइड कर सकते हैं जिसमें match_limit सेट किया गया है, और PCRE_EXTRA_MATCH_LIMIT को झंडे के क्षेत्र में सेट किया गया है। यदि सीमा पार हो गई है, तो pcre_exec () PCRE_ERROR_MATCHLIMIT लौटाता है।

Match_limit_recursion फ़ील्ड match_limit के समान है, लेकिन मैच () कहा जाने वाले कुल समय को सीमित करने के बजाय, यह पुनरावृत्ति की गहराई को सीमित करता है। पुनरावृत्ति की गहराई कुल संख्याओं की तुलना में एक छोटी संख्या है, क्योंकि सभी कॉल मैच () के लिए पुनरावर्ती नहीं हैं। यह सीमा केवल तभी उपयोग की जाती है जब इसे match_limit से छोटा सेट किया जाता है।

चूंकि पीसीआरई लाइब्रेरी अंतर्निहित डिफ़ॉल्ट 10000000 है, मेरा अनुमान है कि अनुरोधों को लंबे समय तक आयोजित होने से रोकने के लिए mod_security के लिए निम्न सेटिंग का सुझाव दिया गया है।


modsecurity का डिफ़ॉल्ट मान 1500 है , जो कि 1M से काफी कम है। 150000 की ओपी का मूल्य तब सेटिंग में वृद्धि होगी, इसे घटाना नहीं।
पॉल मौगेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.