हमलों के खिलाफ नियमित अभिव्यक्ति के उपयोगकर्ता इनपुट की रखवाली


9

मुझे रेगुलर एक्सप्रेशन डेनियल ऑफ सर्विस (ReDoS) की जानकारी है। क्या कोई उचित तरीका है कि उपयोगकर्ताओं को यह सुनिश्चित करने के लिए कि वे एक घातीय धीमी गति से जमा नहीं करते हैं, कस्टम रीगेक्स बनाने की अनुमति दें?


आपके पास विवरण की कमी है। प्लेटफ़ॉर्म, उपयोग, आदि
whatsisname

8
खराब रेगेक्स प्रस्तुत करने वाले उपयोगकर्ता से बचने की कोशिश करने के बजाय, शायद एक ऐसा समाधान जहां निश्चित समय के बाद आप निष्पादन को रद्द कर दें?
शमूएल

जवाबों:


8

नियमित अभिव्यक्तियों के साथ समस्या स्वयं रेगेक्स नहीं है, लेकिन रेगेक्स इंजन जिसमें "सुविधाजनक" सभी प्रकार के ट्रैकरिंग हैं। इसलिए, इन सुविधाओं के बिना एक रेगेक्स इंजन का उपयोग करने से बचा जाता है।

कंप्यूटर विज्ञान की अवधारणा के नियमित भावों को हमेशा रैखिक समय में मिलान किया जा सकता है, क्योंकि वे एक परिमित अवस्था मशीन में संकलित किए जाते हैं। इसलिए एक राज्य-मशीन आधारित रेगेक्स इंजन का इस्तेमाल ReDoS के लिए नहीं किया जा सकता है। हालांकि, आवश्यक राज्य मशीनें पैथोलॉजिकल उदाहरणों में बड़ी हो सकती हैं। लेकिन उपलब्ध मेमोरी को सीमित करने से उपलब्ध गणना समय को सीमित करने की तुलना में आसान हो जाता है।

RE2 इंजन विशेष रूप से विकसित किया गया था अविश्वस्त regexes से निपटने के लिए और रैखिक समय निष्पादन के लिए डिजाइन किया गया था।

एक और विकल्प एक सरल संकेतन से खुद को रेग्जेस इकट्ठा कर रहा है। उदाहरण के लिए, आप उपयोगकर्ताओं को ग्लोब पैटर्न (जैसे *.txt) का उपयोग करने की अनुमति दे सकते हैं । फिर आप इसे एक तरह से पार्स कर सकते हैं, जो पीछे हटने से रोकता है, जैसे कि घोंसला बनाना और केवल लालची मात्रा का उपयोग करना। कई उपयोग मामलों के लिए, एक सरलीकृत पैटर्न संकेतन पूरी तरह से पर्याप्त है।


11

एक नियमित अभिव्यक्ति का विश्लेषण यह देखने के लिए कि क्या यह धीमा होगा या नहीं, विश्लेषण धीमा होने के बिना , रुकने की समस्या को हल करने के लिए मात्रा। दूसरे शब्दों में, एक सही और पूर्ण समाधान खोजना संभव नहीं है

आप कर सकते हैं, ज़ाहिर है, एक समाधान है कि सही और है में पूरा हो गया। उदाहरण के लिए, आप उन सुविधाओं की प्रतिबंधात्मक श्वेत सूची के साथ काम कर सकते हैं जो उपयोग करने के लिए सुरक्षित हैं (उदाहरण के लिए वर्ण वर्ग हाँ, पुनरावृत्ति नहीं ...)। यह आपको बहुत सारे अनजाने रीगेक्स को पारित करने की अनुमति देगा, सभी महत्वपूर्ण लोगों को अस्वीकार कर देगा, और (गलत तरीके से) कुछ को अस्वीकार कर देगा जो ठीक है, लेकिन स्वचालित रूप से सुरक्षित साबित करने के लिए बहुत जटिल है।


3
क्या आपके पास अपने पहले बयान के लिए एक प्रशस्ति पत्र है? मुझे इस तरह के प्रमाण को देखने में दिलचस्पी होगी। Regexes ट्यूरिंग-पूर्ण नहीं हैं, इसलिए हॉल्टिंग समस्या लागू नहीं हो सकती है।
सेबस्टियन रेडल

3
@SebastianRedl यह सच है कि कडाई के साथ नियमित अभिव्यक्ति कर रहे हैं नहीं ट्यूरिंग-पूर्ण, लेकिन लोकप्रिय प्रयोग में सभी regex पुस्तकालयों एक्सटेंशन है कि उन्हें अब नियमित बनाने की है। अपने उपयोगकर्ताओं को शाब्दिक रूप से नियमित अभिव्यक्तियों को प्रतिबंधित करना, वास्तव में, इस स्थिति के लिए एक अच्छा समाधान हो सकता है।
किलन फ़ॉथ

2
@ कोलकाताियन: IIRC, यहां तक ​​कि सही नियमित अभिव्यक्तियाँ (शब्द के CompSci अर्थ में) बैकट्रैकिंग की एक घातीय राशि की आवश्यकता हो सकती है। लेकिन चूंकि वे ट्यूरिंग-पूर्ण नहीं हैं, इसलिए किसी भी regex के लिए इस ऊपरी बाध्यता को स्थापित करना सैद्धांतिक रूप से संभव है। हालाँकि, यह दो समस्याओं को खोलता है: ऊपरी सीमा को स्वचालित रूप से निर्धारित करना एक गैर-तुच्छ कार्य है, और परिणाम अनुचित रूप से उच्च परिणाम दे सकता है (जैसा कि, अपेक्षित समय की तुलना में ऊपरी सीमा बहुत अधिक है )।
एमएसलटर्स

@msalters किसी भी वास्तविक नियमित अभिव्यक्ति को यंत्रवत् परिमित राज्य ऑटोमेटन के लिए यंत्रवत् रूपांतरित किया जा सकता है, अर्थात अभिव्यक्ति को बिना पीछे किए हुए मिलान करना हमेशा संभव है। आपका एफएसए अनुचित रूप से बड़ा हो सकता है, ज़ाहिर है, लेकिन यह बताता है कि उत्पन्न एफएसए में राज्यों की संख्या की एक सीमा प्रश्न में हमले को रोकने के लिए एक पर्याप्त समाधान है।
जूल्स

1

लाजर परियोजना के लिए पुन: पार्सर के लेखक के रूप में मैं कहूंगा कि किसी भी नियमित अभिव्यक्ति के लिए समझने के लिए कोई तरीका नहीं है कि किसी दिए गए पाठ पर क्या संसाधनों का उपभोग होगा।

समान संसाधनों को खर्च किए बिना मेरा मतलब है (कम से कम बिग-ओ अर्थ में)।

तो सबसे अच्छा तरीका - अलग-अलग धागे में फिर से पार्सर चलाएं और टाइमआउट के बाद इसे मार दें।


0

अन्य उत्तरों के अलावा, एक समाधान आपके खुद के रेगेक्स लाइब्रेरी को रोल करने के लिए भी हो सकता है, जो निष्पादन के दौरान प्रदर्शन इंस्ट्रूमेंटेशन की अनुमति देता है, और इस प्रकार निष्पादन मानदंड को मारने का साधन प्रदान करता है यदि कुछ मानदंड पूरे होते हैं।

इसी तरह, आप रेगेक्स को किसी अन्य थ्रेड पर चला सकते हैं और थ्रेड्स को मार सकते हैं यदि वे बहुत लंबे समय तक लेते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.