ईविल रेग्जेस एक समस्या क्यों हैं?
क्योंकि कंप्यूटर वास्तव में वही करते हैं जो आप उन्हें करने के लिए कहते हैं, भले ही वह वही न हो जिसका आपका मतलब था या पूरी तरह से अनुचित है। यदि आप एक रेगेक्स इंजन को यह साबित करने के लिए कहते हैं कि, कुछ दिए गए इनपुट के लिए, दिए गए पैटर्न के लिए मैच है या नहीं है, तो इंजन यह करने का प्रयास करेगा कि कोई फर्क नहीं पड़ता कि कितने विभिन्न संयोजनों का परीक्षण किया जाना चाहिए।
यहाँ ओपी के पद में पहले उदाहरण से प्रेरित एक सरल पैटर्न है:
^((ab)*)+$
इनपुट दिया:
abababababababababababab
रेगेक्स इंजन कुछ इस तरह की कोशिश करता है (abababababababababababab)और पहली कोशिश में एक मैच मिलता है।
लेकिन फिर हम बंदर रिंच में फेंक देते हैं:
abababababababababababab एक
इंजन पहले प्रयास करेगा (abababababababababababab)लेकिन उस अतिरिक्त के कारण विफल हो जाता है a। यह भयावह कोष्ठक का कारण बनता है, क्योंकि हमारे पैटर्न (ab)*, अच्छे विश्वास के एक शो में, इसमें से एक को कैप्चर (यह "बैकट्रैक") जारी करेगा और बाहरी पैटर्न को फिर से प्रयास करने देगा। हमारे रेगेक्स इंजन के लिए, जो कुछ इस तरह दिखता है:
(abababababababababababab)- नोप
(ababababababababababab)(ab)- नोप
(abababababababababab)(abab)- नोप
(abababababababababab)(ab)(ab)- नोप
(ababababababababab)(ababab)- नोप
(ababababababababab)(abab)(ab)- नोप
(ababababababababab)(ab)(abab)- नोप
(ababababababababab)(ab)(ab)(ab)- नोप
(abababababababab)(abababab)- नोप
(abababababababab)(ababab)(ab)- नोप
(abababababababab)(abab)(abab)-
(abababababababab)(abab)(ab)(ab)नोप
(abababababababab)(ab)(ababab)- नोप
(abababababababab)(ab)(abab)(ab)- नोप
(abababababababab)(ab)(ab)(abab)- नोप
(abababababababab)(ab)(ab)(ab)(ab)- नोप
(ababababababab)(ababababab)- नोप
(ababababababab)(abababab)(ab)- नोप
(ababababababab)(ababab)(abab)- नोप
(ababababababab)(ababab)(ab)(ab)- नोप
(ababababababab)(abab)(abab)(ab)- नोप
(ababababababab)(abab)(ab)(abab)- नोप
(ababababababab)(abab)(ab)(ab)(ab)- नोप
(ababababababab)(ab)(abababab)- नोप
(ababababababab)(ab)(ababab)(ab)- नोप
(ababababababab)(ab)(abab)(abab)- नहीं
(ababababababab)(ab)(abab)(ab)(ab)- नहीं
(ababababababab)(ab)(ab)(ababab)- नहीं
(ababababababab)(ab)(ab)(abab)(ab)- नहीं
(ababababababab)(ab)(ab)(ab)(abab)- नहीं
(ababababababab)(ab)(ab)(ab)(ab)(ab)- नहीं
...
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(abababab) - नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ababab)(ab)- नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(abab)(abab)- नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(abab)(ab)(ab)- नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ababab)- नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(abab)(ab)- नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(abab)- नहीं
(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)(ab)- नहीं - नहीं - नहीं
इनपुट की लंबाई के साथ संभावित संयोजनों की संख्या तेजी से बढ़ती है और, इससे पहले कि आप इसे जानते हैं, रेगेक्स इंजन आपके सभी सिस्टम संसाधनों को खा रहा है जब तक कि इस चीज को हल करने की कोशिश की जा रही है, जब तक कि शर्तों के हर संभव संयोजन को समाप्त नहीं हो जाता, यह अंत में छोड़ देता है। रिपोर्ट "कोई मेल नहीं है।" इस बीच आपका सर्वर पिघले हुए धातु के जलते हुए ढेर में बदल गया है।
ईविल रेगेक्स को कैसे स्पॉट करें
यह वास्तव में बहुत मुश्किल है। मैंने खुद एक युगल लिखा है, भले ही मुझे पता है कि वे क्या हैं और आम तौर पर उनसे कैसे बचा जाए। रेगेक्स को आश्चर्यजनक रूप से लंबे समय तक लेते हुए देखें । एक परमाणु समूह में आप जो कुछ भी कर सकते हैं उसे लपेटकर बैकट्रैकिंग मुद्दे को रोकने में मदद कर सकते हैं। यह मूल रूप से रेगेक्स इंजन को किसी दिए गए एक्सप्रेशन को फिर से प्रदर्शित नहीं करने के लिए कहता है - "जो भी आप पहली कोशिश में मिलान करते हैं उसे लॉक करें"। ध्यान दें, हालांकि, परमाणु अभिव्यक्तियाँ अभिव्यक्ति के भीतर पीछे जाने से नहीं रोकती हैं , इसलिए ^(?>((ab)*)+)$यह अभी भी खतरनाक है, लेकिन ^(?>(ab)*)+$यह सुरक्षित है (यह मेल खाएगा (abababababababababababab)और फिर मिलान किए गए वर्णों में से किसी को भी देने से इनकार कर देगा, इस प्रकार भयावह बैकट्रैकिंग को रोकना)।
दुर्भाग्य से, एक बार यह लिखे जाने के बाद, यह वास्तव में तुरंत या बहुत जल्दी एक समस्या regex खोजने के लिए बहुत कठिन है। अंत में, एक खराब रेगेक्स को पहचानना किसी अन्य बुरे कोड को पहचानने जैसा है - इसमें बहुत समय और अनुभव और / या एक भी विपत्तिपूर्ण घटना होती है।
दिलचस्प बात यह है कि चूंकि यह उत्तर पहली बार लिखा गया था, ऑस्टिन के टेक्सास विश्वविद्यालय में एक टीम ने इन "बुराई" पैटर्न को खोजने के व्यक्त उद्देश्य के साथ नियमित अभिव्यक्तियों के स्थैतिक विश्लेषण करने में सक्षम उपकरण के विकास का वर्णन करते हुए एक पेपर प्रकाशित किया था। जावा प्रोग्राम्स का विश्लेषण करने के लिए टूल विकसित किया गया था, लेकिन मुझे संदेह है कि आने वाले वर्षों में हम जावास्क्रिप्ट और अन्य भाषाओं में एनालाइजिंग और समस्याग्रस्त पैटर्नों के आसपास विकसित किए गए अधिक टूल देखेंगे, विशेष रूप से जब तक कि ReDoS हमलों की दर चढ़ाई जारी है ।
कार्यक्रमों में DoS कमजोरियों की स्थैतिक पहचान जो रेगुलर एक्सप्रेशंस वाले
वेलेंटीन वुस्टहोलज़, ओस्वाल्डो ओलिवो, मेराज जेएच हेउल और
ऑस्टिन में टेक्सास विश्वविद्यालय के आइल डिलिग का उपयोग करती है