मुझे रेगुलर एक्सप्रेशन डेनियल ऑफ सर्विस (ReDoS) की जानकारी है। क्या कोई उचित तरीका है कि उपयोगकर्ताओं को यह सुनिश्चित करने के लिए कि वे एक घातीय धीमी गति से जमा नहीं करते हैं, कस्टम रीगेक्स बनाने की अनुमति दें?
मुझे रेगुलर एक्सप्रेशन डेनियल ऑफ सर्विस (ReDoS) की जानकारी है। क्या कोई उचित तरीका है कि उपयोगकर्ताओं को यह सुनिश्चित करने के लिए कि वे एक घातीय धीमी गति से जमा नहीं करते हैं, कस्टम रीगेक्स बनाने की अनुमति दें?
जवाबों:
नियमित अभिव्यक्तियों के साथ समस्या स्वयं रेगेक्स नहीं है, लेकिन रेगेक्स इंजन जिसमें "सुविधाजनक" सभी प्रकार के ट्रैकरिंग हैं। इसलिए, इन सुविधाओं के बिना एक रेगेक्स इंजन का उपयोग करने से बचा जाता है।
कंप्यूटर विज्ञान की अवधारणा के नियमित भावों को हमेशा रैखिक समय में मिलान किया जा सकता है, क्योंकि वे एक परिमित अवस्था मशीन में संकलित किए जाते हैं। इसलिए एक राज्य-मशीन आधारित रेगेक्स इंजन का इस्तेमाल ReDoS के लिए नहीं किया जा सकता है। हालांकि, आवश्यक राज्य मशीनें पैथोलॉजिकल उदाहरणों में बड़ी हो सकती हैं। लेकिन उपलब्ध मेमोरी को सीमित करने से उपलब्ध गणना समय को सीमित करने की तुलना में आसान हो जाता है।
RE2 इंजन विशेष रूप से विकसित किया गया था अविश्वस्त regexes से निपटने के लिए और रैखिक समय निष्पादन के लिए डिजाइन किया गया था।
एक और विकल्प एक सरल संकेतन से खुद को रेग्जेस इकट्ठा कर रहा है। उदाहरण के लिए, आप उपयोगकर्ताओं को ग्लोब पैटर्न (जैसे *.txt
) का उपयोग करने की अनुमति दे सकते हैं । फिर आप इसे एक तरह से पार्स कर सकते हैं, जो पीछे हटने से रोकता है, जैसे कि घोंसला बनाना और केवल लालची मात्रा का उपयोग करना। कई उपयोग मामलों के लिए, एक सरलीकृत पैटर्न संकेतन पूरी तरह से पर्याप्त है।
एक नियमित अभिव्यक्ति का विश्लेषण यह देखने के लिए कि क्या यह धीमा होगा या नहीं, विश्लेषण धीमा होने के बिना , रुकने की समस्या को हल करने के लिए मात्रा। दूसरे शब्दों में, एक सही और पूर्ण समाधान खोजना संभव नहीं है ।
आप कर सकते हैं, ज़ाहिर है, एक समाधान है कि सही और है में पूरा हो गया। उदाहरण के लिए, आप उन सुविधाओं की प्रतिबंधात्मक श्वेत सूची के साथ काम कर सकते हैं जो उपयोग करने के लिए सुरक्षित हैं (उदाहरण के लिए वर्ण वर्ग हाँ, पुनरावृत्ति नहीं ...)। यह आपको बहुत सारे अनजाने रीगेक्स को पारित करने की अनुमति देगा, सभी महत्वपूर्ण लोगों को अस्वीकार कर देगा, और (गलत तरीके से) कुछ को अस्वीकार कर देगा जो ठीक है, लेकिन स्वचालित रूप से सुरक्षित साबित करने के लिए बहुत जटिल है।
लाजर परियोजना के लिए पुन: पार्सर के लेखक के रूप में मैं कहूंगा कि किसी भी नियमित अभिव्यक्ति के लिए समझने के लिए कोई तरीका नहीं है कि किसी दिए गए पाठ पर क्या संसाधनों का उपभोग होगा।
समान संसाधनों को खर्च किए बिना मेरा मतलब है (कम से कम बिग-ओ अर्थ में)।
तो सबसे अच्छा तरीका - अलग-अलग धागे में फिर से पार्सर चलाएं और टाइमआउट के बाद इसे मार दें।
अन्य उत्तरों के अलावा, एक समाधान आपके खुद के रेगेक्स लाइब्रेरी को रोल करने के लिए भी हो सकता है, जो निष्पादन के दौरान प्रदर्शन इंस्ट्रूमेंटेशन की अनुमति देता है, और इस प्रकार निष्पादन मानदंड को मारने का साधन प्रदान करता है यदि कुछ मानदंड पूरे होते हैं।
इसी तरह, आप रेगेक्स को किसी अन्य थ्रेड पर चला सकते हैं और थ्रेड्स को मार सकते हैं यदि वे बहुत लंबे समय तक लेते हैं।