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

ReDoS-பாதுகாப்பான வடிவங்களை எழுதுதல்

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

உன்னதமான பேரழிவு முறை

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

பொருத்துவதற்கு, எஞ்சின் ஒவ்வொரு சாத்தியமான "a" பகிர்வையும் முயற்சிக்கிறது இரண்டு + அளவுகோல்கள். 20 "a"களில் 2^20 = ~1 மில்லியன் முயற்சிகள். 30 "a"களில், ஒரு பில்லியன்.

மற்ற ஆபத்தான எடுத்துக்காட்டுகள்:

  • (a*)*b -- "உள்ளமை நட்சத்திரங்கள்".
  • (a|a)* -- ஒன்றுடன் ஒன்று மாற்றுகள்.
  • (\w+)+@ -- வெளிப்புற அளவுகோலுடன் பேராசை கொண்ட குழுக்கள்.

ஆபத்தை எவ்வாறு கண்டறிவது

இந்த கட்டமைப்புகளைத் தேடுங்கள்:

  1. குவாண்டிஃபையரில் உள்ள அளவுகோல்: (...+)+, (...*)*, (...{n,})+.
  2. ஒரு அளவுகோலின் கீழ் மேற்பொருந்தும் மாற்றுகள்: (a|ab)*, (\w|\d)+.
  3. Lookhead/lookbehind with complex மாற்றுகளுடன் மீண்டும் மீண்டும்.

தற்காப்பு மீண்டும் எழுதுதல்

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

பாதுகாப்பான பதிப்பு **அடிப்படை வழக்கை மீண்டும் மீண்டும் வரும் வழக்கிலிருந்து பிரிக்கிறது, நீக்குகிறது தெளிவின்மை. பிற நுட்பங்கள்:

  • உடைமை அளவுகோல்கள் (a++) -- JS இல் ஆதரிக்கப்படவில்லை, ஆனால் மற்ற இயந்திரங்களில் கிடைக்கும்.
  • அணு வடிவங்கள் ((?>...)) -- JS இல் இல்லை.
  • பொருத்துவதற்கு முன் உள்ளீட்டின் நீளத்தை ** வரம்பிடவும்.
  • காலக்கெடு பொருத்தம் (இந்த பாடத்திட்டத்தின் எடிட்டர் 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+spaces+)*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 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்