ماڈیول اسباق (4/4)
ReDoS-محفوظ پیٹرن لکھنا
ReDoS (سروس کا باقاعدہ اظہار انکار) حملوں کی ایک کلاس ہے جہاں احتیاط سے تیار کیا گیا ان پٹ ریجیکس کے پھٹنے کا وقت بناتا ہے۔ جے ایس انجن بیک ٹریکنگ کا استعمال کرتا ہے: اگر کوئی پیٹرن "مبہم" ہے، ایک پر بدقسمت ان پٹ یہ کوششوں کی ایک کفایتی تعداد کو انجام دے سکتا ہے۔
کلاسک تباہ کن پیٹرن
Pattern: ^(a+)+$
Input: "aaaaaaaaaaaaaaaaaaaaab"میچ کرنے کے لیے، انجن "a" کے درمیان ہر ممکنہ تقسیم کی کوشش کرتا ہے۔
دو + کوانٹیفائر۔ 20 "a" پر یہ 2^20 = ~1 ملین کوششیں ہیں۔
30 "a" پر، ایک ارب۔
دیگر خطرناک مثالیں:
(a*)*b-- "گھوںسلا ستارے"۔(a|a)*-- اوور لیپنگ متبادل۔(\w+)+@-- بیرونی مقدار کے ساتھ لالچی گروہ۔
خطرے کو کیسے پہچانا جائے۔
ان ڈھانچے کو تلاش کریں:
- کوانٹیفائر کے اندر کوانٹیفائر:
(...+)+،(...*)*،(...{n,})+۔ - کوانٹیفائر کے تحت اوور لیپنگ متبادل:
(a|ab)*، (\w|\d)+۔ - پیچیدہ متبادل کے ساتھ دیکھو/پیچھے کی طرف دیکھو بار بار۔
دفاعی دوبارہ لکھنا
Dangerous: ^(\w+\s+)+$
Safe: ^(?:\w+\s+)*\w+$محفوظ ورژن **بیس کیس کو بار بار کیس سے الگ کرتا ہے، ہٹاتا ہے۔ ابہام دیگر تکنیک:
- مقابلہ کوانٹیفائر (
a++) -- JS میں تعاون یافتہ نہیں، لیکن دوسرے انجنوں میں دستیاب ہیں۔ - ایٹمی پیٹرن (
(?>...)) -- JS میں نہیں۔ - **مماثلت سے پہلے ان پٹ کی لمبائی کو محدود کریں۔
- میچنگ پر ٹائم آؤٹ (اس کورس کا ایڈیٹر 500 ایم ایس ٹائم آؤٹ کے ساتھ کارکن کا استعمال کرتا ہے)۔
ReDoS-محفوظ پیٹرن کے لیے سفارشات
- اس بات کو یقینی بنائیں کہ متبادل کے اختیارات باہمی طور پر مخصوص ہیں (مثلاً
(a|a+)استعمال نہ کریں)۔ - اوور لیپنگ ایکسپریشنز (جیسے
(\\s*)*) پر نیسٹڈ کوانٹیفائر لگانے سے گریز کریں۔ - ہمیشہ عام وائلڈ کارڈ ڈاٹ (
.*) پر مخصوص منفی کریکٹر کلاسز ([^\\n]*) کو ترجیح دیں۔
اسے آزمائیں
بار بار حروف کے نمونوں کی شناخت کریں -- لیکن ReDoS-محفوظ طریقے سے۔ ایک واحد کریکٹر کلاس استعمال کریں، نیسٹڈ گروپس نہیں جیسے (a+)+۔
اشارہ دکھائیں۔
خطرناک (a+)+ کو سادہ a+ سے بدل دیں۔ نتیجہ ایک ہی ہے، لیکن محفوظ ہے.
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ReDoS-محفوظ طریقے سے، خالی جگہوں سے الگ کیے گئے الفاظ کی ترتیب کو پہچانیں۔ ساخت `(?:word+space+)*word` کی بجائے `(word+space+)+` استعمال کریں۔
اشارہ دکھائیں۔
کیپچر کرنے والے گروپ (\\w+\\s+)+ کو ڈس جوائنٹ ورژن (?:\\w+\\s+)*\\w+ سے بدل دیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
اضافی چیلنج
Make the vulnerable pattern `(\w+\s*)+:` which causes ReDoS safe, by removing the overlapping whitespace recursion.
اشارہ دکھائیں۔
اسپیس کو منتقل کریں تاکہ یہ گروپ کی تکرار کے ساتھ اوورلیپ نہ ہو: (?:\\w+\\s+)*\\w+:
3 کوششوں کے بعد حل دستیاب ہے۔