முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 2 · பாடம் 4 இன் 4பாடத்திட்டத்தில் 8/32~12 min
தொகுதி பாடங்கள் (4/4)

பின்னோட்டம்: ஒரு கண்ணோட்டம்

ஒரு பேராசை கொண்ட அளவுகோல் "ஓவர்ஷூட்" ஆகும்போது, இயந்திரம் பின்னடிப்பு செய்கிறது: அது பின்வாங்குகிறது, மற்றொரு உள்ளமைவை முயற்சிக்கிறது, மீண்டும் முயற்சிக்கிறது. எளிய வடிவங்களில் அது கண்ணுக்கு தெரியாதது; மோசமாக எழுதப்பட்ட வடிவங்களில் அது அதிவேகமாக ஆகலாம் உலாவியை நொடிகளுக்கு முடக்கவும். இது ReDoS இன் ரூட் (வழக்கமானது வெளிப்பாடு சேவை மறுப்பு).

Code
Pattern: .*\d
Sample:  abc123def
Steps:
  1.  .*  consumes everything: "abc123def"
  2.  \d  fails (end of string).
  3.  Backtrack: .* drops 'f' -> "abc123de", \d fails on 'f'.
  4.  Backtrack: .* drops 'ef' -> "abc123d", \d fails on 'e'.
  5.  ... and so on until \d finds a digit: match = "abc123" + "?"... actually
       the pattern matches "abc123" because .* leaves "def" and \d looks at '3'? No: the
       backtrack continues and .* ends up being "abc12", \d=3.  Final match: "abc123".

எஞ்சின் எப்போதும் அங்கு வரும், ஆனால் பேராசை கொண்ட அளவுகோல் இருந்தால் மற்றொரு பேராசை அளவுகோல் (எ.கா. (a+)+), உள்ளமைவுகளின் எண்ணிக்கை முயற்சி வெடிக்க முடியும்.

பேரழிவு வடிவங்கள்

Code
Pattern: (a+)+b
Sample:  aaaaaaaaaaaaaaaaaaaaa

பின்தொடரவில்லை b → முறை தோல்வியடைந்தது, ஆனால் அங்கு செல்ல எஞ்சின் ஒவ்வொரு முறையும் முயற்சிக்கிறது as இன் சாத்தியமான பகிர்வு. அதிவேக வளர்ச்சி: 30 as உடன் உங்களால் முடியும் மணிக்கணக்கில் காத்திருக்கவும்.

பின்னடைவு மற்றும் ReDoS இன் அபாயங்கள்

ஒரு முறை ஒன்றுடன் ஒன்று அல்லது உள்ளமைக்கப்பட்ட அளவுகோல்களைக் கொண்டிருக்கும்போது (எ.கா. (a+)+), தோல்வியடைவதற்கு முன், எஞ்சின் அதிவேக எண்ணிக்கையிலான பாதைகளை மதிப்பிடுகிறது. எழுத்து வகுப்புகளைத் தவிர்த்து பொதுவான வைல்டு கார்டுகளை மாற்றுவது பின்தங்கிய பாதைகளை வெகுவாகக் குறைக்கிறது.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#regex.m2.l4.e1
முயற்சிகள்: 0ஏற்றுகிறது…

உரையில் உள்ள ஒவ்வொரு நிகழ்வுக்கும் சதுர அடைப்புக்குறிக்குள் உள்ளடக்கத்தை பிரித்தெடுக்கவும். பிந்தைய மூடல்களுக்குத் தாவுவதைத் தவிர்க்க, அளவீட்டின் சோம்பேறி பதிப்பைப் பயன்படுத்தவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

\\[.*?\\] முதல் மூடலில் நிறுத்தப்படும் ]: அதிக பின்னடைவு இல்லை.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#regex.m2.l4.e2
முயற்சிகள்: 0ஏற்றுகிறது…

உரையில் உள்ள ஒவ்வொரு `http://...` அல்லது `https://...` URL ஐயும், விருப்பமான `s`க்கான `?` அளவையும், பாதையின் இடம் இல்லாத எழுத்துகளுக்கு `\\S+` ஐப் பயன்படுத்தியும் கண்டறியவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

https? அதாவது 'http' என்பதைத் தொடர்ந்து விருப்பமான 's'. பின்னர் //, பின்னர் \\S+ (இடங்கள் அல்லாதவை).

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

கூடுதல் சவால்

உடற்பயிற்சி#regex.m2.l4.e3
முயற்சிகள்: 0ஏற்றுகிறது…

Match strings enclosed in double quotes, avoiding excessive backtracking by using the negated class `[^"]*` instead of `.*`.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

Replace the dot with the negated class [^"] to restrict the engine's backtracking paths.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்