שיעורי מודול (4/4)
כתיבת תבניות בטוחות ב-ReDoS
ReDoS (מניעת שירות של ביטוי רגיל) הוא סוג של התקפות שבהן קלט מעוצב בקפידה גורם לזמן ההתאמה של ביטוי רגיל להתפוצץ. מנוע JS משתמש ב-backtracking: אם דפוס הוא "דו-משמעי", ב-an קלט חסר מזל זה יכול לבצע מספר אקספוננציאלי של ניסיונות.
הדפוס הקטסטרופלי הקלאסי
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 ניסיונות