Dart භාෂාවේ RegExp පාවිච්චි කරමින් අපි සාමාන්යයෙන් පේළි, නාම, ටැග් වැනි ලේඛන සත්යාපනය කරමු. නමුත් සමහර regex රටාවන්, විශේෂයෙන් අන්තරාය අගුළු (nested quantifiers) ඇතුළත් වූවන්, ඉතා අසීරු වේලාවක අත්විඳීමට හේතුව වෙයි.
උදාහරණයක් ලෙස ^((\w+\s?))*$ යන රෙගුලාර් එක “x” අක්ෂර 31 ක් එකට පමණක් යෙදී, Dart 3.11 හි dart:core RegExp මඟින් සත්යාපනය කිරීමට 5.15 සෙකන්ඩ් ගත විය. එම ගැටලුව (a+)+$ වැනි රෙගුලාර් වල තවත් නරක තත්ත්වයක් දක්වයි; 29 ‘a’ අක්ෂර සඳහා 2.77 සෙකන්ඩ්, 31 අක්ෂර සඳහා කාලය අවසන් නොවීය.
මෙම වර්ගය ReDoS (Regular Expression Denial of Service) ලෙස හැඳින්වේ. ප්රතිලාභයක් නැති ඉල්ලීම් හෝ බොට් ජාලයක් අවශ්ය නොවී, වැරදි රෙගුලාර් එකකට වරක් පමණක් ඉදිරිපත් කිරීමෙන් සේවාදායකය අත්හිටුවිය හැක.
Google විසින් සංවර්ධනය කරන RE2 නම් රෙගුලාර් එන්ජින්, FFI (Foreign Function Interface) මඟින් Dart සමඟ සම්බන්ධ කරගත හැක. RE2 හි සෙවුම් කාලය ලීනියර් වන අතර, ඒකකයක් 31 ‘x’ අක්ෂර සඳහා 25 µs පමණ වේ. 100,001 අක්ෂරයක් සඳහාද 1 ms කාලයක් පමණක් ගනී; dart:core RegExp එය සම්පූර්ණයෙන්ම කර නොහැක.
RE2 භාවිතය පහසුය. import 'package:re2/re2.dart'; යන import එකක් එක්ක, Re2(r'^((\w+\s?))*$') ලෙස රෙගුලාර් එක නිර්මාණය කර, hasMatch() හෝ firstMatch() මාර්ගයෙන් පරීක්ෂා කළ හැක. අවසානයේ dispose() හෝ NativeFinalizer මගින් සම්පත් නිදහස් කිරීම අමතක නොකරන්න.
සියලුම අන්තර්ගතිත පරමාණුක රෙගුලාර් එකක් අවදානම් නොවේ. උදාහරණයක් ලෙස ඊ-මේල් රෙගුලාර් ^([\w.-])+@(([\w-])+\.)+([a-zA-Z0-9]{2,4})+$ තුළ ලූප් අතර ලූප් ඇතත්, ලූප් අතර dot (.) අක්ෂරයක් තිබීම නිසා සත්යාපනය වේගවත් වේ. ප්රධාන අවදානම වන්නේ අස්ථිරත්වය ඇති අන්තර්ගතිත පරාමිතීන් (උදා: backreferences, lookaround) ය.
ශ්රී ලංකාවට ඇති වැදගත්කම
ශ්රී ලංකාවේ තාක්ෂණික කාර්ය මණ්ඩලය, විශේෂයෙන් Flutter/Dart සංවර්ධකයන්, මෙම ගැටලුව පිළිබඳ අවධානයක් ලබා ගැනීමෙන් ලාභී වේ.
- ඉගෙනුම් ආකාරය: විශ්වවිද්යාල, තාක්ෂණික පාඨමාලා තුළ regex ආරක්ෂාව පිළිබඳ නව මොඩියුලයක් ඇතුළත් කිරීම.
- ව්යාපාරික ප්රයෝජනය: වෙබ් API, WAF, ලොග් විශ්ලේෂක වැනි සේවා වල ReDoS ආකාරයේ ප්රහාරයන්ට එරෙහිව RE2 භාවිතය, සේවා නතර වීමේ අවදානම අඩු කරයි.
- සංවර්ධකයන්ට: FFI මඟින් RE2 එකතු කිරීම ඉතා සරල; කේතය ලීනියර් වේගයෙන් ක්රියා කර, පරිශීලක අත්දැකීම අඩු කරයි.
අවසන් වශයෙන්, Dart හි පසුබැසීමේ regex එන්ජින් අඩු කාලීන ප්රතිචාරයක් ලබා දීමට නොහැකි බව සැලකිල්ලට ගෙන, RE2 වැනි ලීනියර් එන්ජින් භාවිතය අනිවාර්ය වේ. ඔබේ ප්රොජෙක්ට් වල RE2 භාවිතය අත්හදා බලන්න!