सेवा की चिंता के इनकार ‐
Regexes के साथ सबसे आम चिंता पैथोलॉजिकल पैटर्न के माध्यम से path सेवा हमले का एक खंडन है जो घातीय है - या सुपर ential घातीय! - और इसलिए हमेशा के लिए हल निकालने के लिए दिखाई देते हैं। ये केवल विशेष इनपुट डेटा पर दिखाई दे सकते हैं, लेकिन आम तौर पर कोई एक बना सकता है जिसमें यह कोई फर्क नहीं पड़ता।
इनमें से कौन सा कुछ इस बात पर निर्भर करेगा कि आपके द्वारा उपयोग किए जा रहे रेगेक्स कंपाइलर कितने स्मार्ट होते हैं, क्योंकि इनमें से कुछ कंपाइलर समय के दौरान पता लगाए जा सकते हैं। रेगेक्स कंपाइलर्स जो पुनरावृत्ति को लागू करते हैं, आमतौर पर पुनरावृत्ति में एक अंतर्निहित comp होता है ‐ नॉन। प्रगति की जाँच के लिए गहराई काउंटर।
नियमित अभिव्यक्ति मिलान पर रस कॉक्स का उत्कृष्ट 2007 का पेपर सरल और तेज़ हो सकता है (लेकिन जावा, पर्ल, पीएचपी, पायथन, रूबी, ... में धीमा है) उन तरीकों के बारे में बात करता है जो अधिकांश आधुनिक एनएफए, जो सभी हेनरी स्पेंसर के कोड को प्राप्त करते हैं। , गंभीर प्रदर्शन में गिरावट, लेकिन जहां एक थॉम्पसन FA शैली एनएफए ऐसी कोई समस्या नहीं है।
यदि आप केवल उन पैटर्नों को स्वीकार करते हैं जिन्हें डीएफए द्वारा हल किया जा सकता है, तो आप उन्हें इस तरह से संकलित कर सकते हैं, और वे तेजी से चलेंगे, संभवतः बहुत तेजी से। हालाँकि, ऐसा करने में समय लगता है । कॉक्स पेपर में इस दृष्टिकोण और इसके परिचर मुद्दों का उल्लेख है। यह सब एक क्लासिक समय अंतरिक्ष व्यापार के लिए नीचे आता है a बंद।
डीएफए के साथ, आप इसे बनाने में अधिक समय बिताते हैं (और अधिक राज्यों को आवंटित करते हैं), जबकि एनएफए के साथ आप इसे निष्पादित करने में अधिक समय व्यतीत करते हैं, क्योंकि यह एक ही समय में कई राज्य हो सकते हैं, और पीछे चलकर आपका दोपहर का भोजन खा सकते हैं - और आपका सीपीयू।
सेवा समाधान के इनकार
संभवतः इन पैटर्नों को संबोधित करने का सबसे उचित तरीका है कि गर्मी की दौड़ के अंत में ब्रह्मांड की मृत्यु के साथ way मौत उन्हें एक टाइमर के साथ लपेटना है जो प्रभावी रूप से उनके निष्पादन के लिए अधिकतम समय की अनुमति देता है। आमतौर पर यह बहुत अधिक होगा, जो कि अधिकांश HTTP सर्वर प्रदान करने वाले डिफ़ॉल्ट टाइमआउट से बहुत कम है।
इन्हें लागू करने के विभिन्न तरीके हैं, जिनमें alarm(N)
सी स्तर पर एक सरल , कुछ प्रकार के try {}
कैच अलार्म all प्रकार के अपवादों को शामिल किया गया है, एक नए थ्रेड को अलग करने के लिए सभी तरीके जो विशेष रूप से सही समय में निर्मित एक समय बाधा के साथ बनाए गए हैं।
कोड कॉलआउट
Regex भाषाओं में, जो कोड कॉलआउट को स्वीकार करते हैं, आपके द्वारा संकलित किए जा रहे स्ट्रिंग से इन्हें अनुमति देने या अस्वीकार करने के लिए कुछ तंत्र प्रदान किया जाना चाहिए। यहां तक कि अगर कोड कॉलआउट केवल उस भाषा में कोड करने के लिए हैं जिसे आप उपयोग कर रहे हैं, तो आपको उन्हें प्रतिबंधित करना चाहिए; उन्हें बाहरी कोड को कॉल करने में सक्षम होने की आवश्यकता नहीं है, हालांकि यदि वे कर सकते हैं, तो आपको बहुत बड़ी समस्याएं मिल सकती हैं।
उदाहरण के लिए, Perl में स्ट्रिंग इंटरपोलेशन से बनाई गई रेगेक्स में कोड कॉलआउट नहीं हो सकते हैं (जैसा कि ये होंगे, क्योंकि वे रन) समय के दौरान संकलित किए जाते हैं) जब तक कि विशेष लेक्सिकली use re "eval";
current चालू दायरे में सक्रिय रूप से प्रॉप्मा नहीं किया जाता है।
rm -rf *
उदाहरण के लिए, सिस्टम प्रोग्राम चलाने के लिए कोई भी एक कोड कॉलआउट में चुपके नहीं कर सकता है । क्योंकि कोड कॉलआउट इतनी सुरक्षा so संवेदनशील हैं, पर्ल उन्हें सभी प्रक्षेपित स्ट्रिंग्स पर डिफ़ॉल्ट रूप से अक्षम करता है, और आपको उन्हें सक्षम करने के लिए अपने रास्ते से बाहर जाना होगा।
उपयोगकर्ता ‐ परिभाषित \ P {roperties}
जैसे - एक और सुरक्षा के प्रति संवेदनशील यूनिकोड शैली गुण से संबंधित समस्या बनी हुई है \pM
, \p{Pd}
, \p{Pattern_Syntax}
, या \p{Script=Greek}
- कि हो सकता है कुछ regex compilers कि समर्थन कि अंकन में मौजूद हैं।
मुद्दा यह है कि इनमें से कुछ में, संभावित गुणों का सेट उपयोगकर्ता ens एक्स्टेंसिबल है। इसका मतलब है कि आपके पास कस्टम गुण हो सकते हैं जो कि किसी विशेष नामस्थान, जैसे \p{GoodChars}
या में नामित कार्यों के लिए वास्तविक कोड कॉलआउट हैं \p{Class::Good_Characters}
। आपकी भाषा कैसे संभालती है, जो देखने लायक हो सकती है।
सैंडबॉक्सिंग
पर्ल में, Safe
मॉड्यूल के माध्यम से सैंडबॉक्स वाला कम्पार्टमेंट नाम स्थान दृश्यता पर नियंत्रण देगा। अन्य भाषाएं समान सैंडबॉक्सिंग प्रौद्योगिकियों की पेशकश करती हैं। यदि इस तरह के उपकरण उपलब्ध हैं, तो आप उन पर गौर करना चाहते हैं, क्योंकि वे विशेष रूप से अविशिष्ट कोड के सीमित निष्पादन के लिए डिज़ाइन किए गए हैं।