தொகுதி பாடங்கள் (4/4)
ReDoS-பாதுகாப்பான வடிவங்களை எழுதுதல்
ReDoS (வழக்கமான சேவை மறுப்பு) என்பது தாக்குதல்களின் ஒரு வகுப்பாகும் கவனமாக வடிவமைக்கப்பட்ட உள்ளீடு ஒரு ரீஜெக்ஸின் பொருந்தக்கூடிய நேரத்தை வெடிக்கச் செய்கிறது. JS இன்ஜின் பேக் டிராக்கிங்கைப் பயன்படுத்துகிறது: ஒரு முறை "தெளிவற்றதாக" இருந்தால், an இல் துரதிர்ஷ்டவசமான உள்ளீடு இது அதிவேக எண்ணிக்கையிலான முயற்சிகளை மேற்கொள்ளும்.
உன்னதமான பேரழிவு முறை
Pattern: ^(a+)+$
Input: "aaaaaaaaaaaaaaaaaaaaab"பொருத்துவதற்கு, எஞ்சின் ஒவ்வொரு சாத்தியமான "a" பகிர்வையும் முயற்சிக்கிறது
இரண்டு + அளவுகோல்கள். 20 "a"களில் 2^20 = ~1 மில்லியன் முயற்சிகள்.
30 "a"களில், ஒரு பில்லியன்.
மற்ற ஆபத்தான எடுத்துக்காட்டுகள்:
(a*)*b-- "உள்ளமை நட்சத்திரங்கள்".(a|a)*-- ஒன்றுடன் ஒன்று மாற்றுகள்.(\w+)+@-- வெளிப்புற அளவுகோலுடன் பேராசை கொண்ட குழுக்கள்.
ஆபத்தை எவ்வாறு கண்டறிவது
இந்த கட்டமைப்புகளைத் தேடுங்கள்:
- குவாண்டிஃபையரில் உள்ள அளவுகோல்:
(...+)+,(...*)*,(...{n,})+. - ஒரு அளவுகோலின் கீழ் மேற்பொருந்தும் மாற்றுகள்:
(a|ab)*,(\w|\d)+. - Lookhead/lookbehind with complex மாற்றுகளுடன் மீண்டும் மீண்டும்.
தற்காப்பு மீண்டும் எழுதுதல்
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+spaces+)*word` என்ற அமைப்பைப் பயன்படுத்தவும்.
குறிப்பைக் காட்டு
கேப்சரிங் குழுவை (\\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 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்