دروس الوحدة (4/4)
كتابة أنماط ReDoS الآمنة
ReDoS (التعبير العادي لرفض الخدمة) هي فئة من الهجمات حيث المدخلات المصممة بعناية تجعل وقت المطابقة للتعبير العادي ينفجر. يستخدم محرك JS التراجع: إذا كان النمط "غامضًا"، على المدخلات غير المحظوظة يمكنها إجراء عدد هائل من المحاولات.
النمط الكارثي الكلاسيكي
Pattern: ^(a+)+$
Input: "aaaaaaaaaaaaaaaaaaaaab"للمطابقة، يحاول المحرك كل قسم ممكن من "a" بينهما
المحددين الكميين +. في 20 "a" يكون ذلك 2^20 = ~1 مليون محاولة.
في 30 "أ"، مليار.
أمثلة خطيرة أخرى:
(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+spaces+)*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 من المحاولات