मुख्य सामग्री पर जाएं
मॉड्यूल 8 · पाठ 4 का 4पाठ्यक्रम में 32/32~14 min
मॉड्यूल पाठ (4/4)

ReDoS-सुरक्षित पैटर्न लिखना

ReDoS (रेगुलर एक्सप्रेशन डिनायल ऑफ सर्विस) हमलों का एक वर्ग है सावधानीपूर्वक तैयार किया गया इनपुट रेगेक्स के मिलान समय को विस्फोटित कर देता है। जेएस इंजन बैकट्रैकिंग का उपयोग करता है: यदि कोई पैटर्न "अस्पष्ट" है अशुभ इनपुट यह तेजी से संख्या में प्रयास कर सकता है।

क्लासिक विनाशकारी पैटर्न

Code
Pattern: ^(a+)+$
Input:   "aaaaaaaaaaaaaaaaaaaaab"

मिलान करने के लिए, इंजन "a" के बीच हर संभावित विभाजन का प्रयास करता है दो + परिमाणक। 20 "ए" पर यह 2^20 = ~1 मिलियन प्रयास है। 30 "ए" पर, एक अरब।

अन्य खतरनाक उदाहरण:

  • (a*)*b -- "नेस्टेड सितारे"।
  • (a|a)* -- अतिव्यापी विकल्प।
  • (\w+)+@ -- बाहरी परिमाणक वाले लालची समूह।

खतरे का पता कैसे लगाएं

इन संरचनाओं को देखें:

  1. क्वांटिफायर के अंदर क्वांटिफायर: (...+)+, (...*)*, (...{n,})+।
  2. क्वांटिफ़ायर के अंतर्गत ओवरलैपिंग विकल्प: (a|ab)*, (\w|\d)+।
  3. जटिल विकल्पों के साथ आगे देखें/पीछे देखें दोहराया गया।

रक्षात्मक पुनर्लेखन

Code
Dangerous:  ^(\w+\s+)+$
Safe:       ^(?:\w+\s+)*\w+$

सुरक्षित संस्करण बेस केस को दोहराए गए केस से अलग करता है, हटाता है अस्पष्टता. अन्य तकनीकें:

  • संभावित परिमाणक (a++) -- जेएस में समर्थित नहीं है, लेकिन अन्य इंजनों में उपलब्ध है।
  • परमाणु पैटर्न ((?>...)) -- जेएस में नहीं।
  • मिलान से पहले इनपुट की लंबाई सीमित करें।
  • टाइमआउट मिलान पर (इस पाठ्यक्रम का संपादक 500 एमएस टाइमआउट वाले कार्यकर्ता का उपयोग करता है)।

ReDoS-सुरक्षित पैटर्न के लिए अनुशंसाएँ

  1. सुनिश्चित करें कि विकल्प में विकल्प परस्पर अनन्य हैं (उदाहरण के लिए (a|a+) का उपयोग न करें)।
  2. ओवरलैपिंग एक्सप्रेशन (जैसे (\\s*)*) पर नेस्टेड क्वांटिफायर लागू करने से बचें।
  3. हमेशा सामान्य वाइल्डकार्ड डॉट (.*) के स्थान पर विशिष्ट अस्वीकृत वर्ण वर्गों ([^\\n]*) को प्राथमिकता दें।

इसे अजमाएं

व्यायाम#regex.m8.l4.e1
प्रयास: 0लोड हो रहा है...

दोहराए गए अक्षरों के पैटर्न को पहचानें - लेकिन ReDoS-सुरक्षित तरीके से। एकल वर्ण वर्ग का उपयोग करें, (a+)+ जैसे नेस्टेड समूहों का नहीं।

संपादक लोड हो रहा है...
संकेत दिखाएँ

खतरनाक (a+)+ को साधारण a+ से बदलें। नतीजा वही है, लेकिन सुरक्षित है.

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#regex.m8.l4.e2
प्रयास: 0लोड हो रहा है...

ReDoS-सुरक्षित तरीके से, रिक्त स्थान से अलग किए गए शब्दों के अनुक्रम को पहचानें। `(word+space+)+` के बजाय `(?:word+space+)*word` संरचना का उपयोग करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

कैप्चरिंग ग्रुप (\\w+\\s+)+ को असंयुक्त संस्करण (?:\\w+\\s+)*\\w+ से बदलें।

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#regex.m8.l4.e3
प्रयास: 0लोड हो रहा है...

Make the vulnerable pattern `(\w+\s*)+:` which causes ReDoS safe, by removing the overlapping whitespace recursion.

संपादक लोड हो रहा है...
संकेत दिखाएँ

स्थान को स्थानांतरित करें ताकि यह समूह पुनरावृत्ति के साथ ओवरलैप न हो: (?:\\w+\\s+)*\\w+:

3 प्रयासों के बाद समाधान उपलब्ध है