মডিউল পাঠ (4/4)
ReDoS-নিরাপদ নিদর্শন লেখা
ReDoS (রেগুলার এক্সপ্রেশন ডিনায়াল অফ সার্ভিস) হল এক শ্রেণীর আক্রমণ যেখানে একটি সাবধানে তৈরি করা ইনপুট একটি regex বিস্ফোরণের ম্যাচিং সময় করে তোলে। JS ইঞ্জিন ব্যাকট্র্যাকিং ব্যবহার করে: যদি একটি প্যাটার্ন "অস্পষ্ট" হয়, একটিতে দুর্ভাগ্যজনক ইনপুট এটি একটি সূচকীয় সংখ্যক প্রচেষ্টা সঞ্চালন করতে পারে।
ক্লাসিক বিপর্যয়মূলক প্যাটার্ন
Pattern: ^(a+)+$
Input: "aaaaaaaaaaaaaaaaaaaaab"মেলানোর জন্য, ইঞ্জিন চেষ্টা করে প্রতি সম্ভাব্য পার্টিশনের মধ্যে "a" এর
দুটি + কোয়ান্টিফায়ার। 20 "a"s-এ যা 2^20 = ~1 মিলিয়ন প্রচেষ্টা।
30 "a"s এ, এক বিলিয়ন।
অন্যান্য বিপজ্জনক উদাহরণ:
(a*)*b-- "নেস্টেড তারা"।(a|a)*-- ওভারল্যাপিং বিকল্প।(\w+)+@-- লোভী দল যাদের বাইরের কোয়ান্টিফায়ার আছে।
বিপদ কিভাবে চিহ্নিত করা যায়
এই কাঠামোর জন্য দেখুন:
- একটি কোয়ান্টিফায়ারের ভিতরে কোয়ান্টিফায়ার:
(...+)+,(...*)*,(...{n,})+। - কোনটিফায়ারের অধীনে ওভারল্যাপিং বিকল্প:
(a|ab)*,(\w|\d)+। - জটিল বিকল্পের সাথে লুকহেড/লুকহ্যান্ড বারবার।
প্রতিরক্ষামূলক পুনর্লিখন
Dangerous: ^(\w+\s+)+$
Safe: ^(?:\w+\s+)*\w+$নিরাপদ সংস্করণ **বেস কেসটিকে পুনরাবৃত্ত কেস থেকে আলাদা করে, সরিয়ে দেয় অস্পষ্টতা অন্যান্য কৌশল:
- পজেসিভ কোয়ান্টিফায়ার (
a++) -- JS-এ সমর্থিত নয়, কিন্তু অন্যান্য ইঞ্জিনে উপলব্ধ। - পারমাণবিক নিদর্শন (
(?>...)) -- JS-এ নয়। - **মেলার আগে ইনপুটের দৈর্ঘ্য ** সীমিত করুন।
- টাইমআউট ম্যাচিংয়ে (এই কোর্সের এডিটর একজন কর্মীকে ব্যবহার করে যার 500 ms টাইমআউট)।
ReDoS-নিরাপদ নিদর্শনগুলির জন্য সুপারিশ
- নিশ্চিত করুন যে বিকল্পের বিকল্পগুলি পারস্পরিকভাবে একচেটিয়া (যেমন
(a|a+)ব্যবহার করবেন না)। - ওভারল্যাপিং এক্সপ্রেশনে নেস্টেড কোয়ান্টিফায়ার প্রয়োগ করা এড়িয়ে চলুন (যেমন
(\\s*)*)। - সর্বদা জেনেরিক ওয়াইল্ডকার্ড ডট (
.*) থেকে নির্দিষ্ট নেগেটেড ক্যারেক্টার ক্লাস ([^\\n]*) পছন্দ করুন।
চেষ্টা করে দেখুন
বারবার অক্ষরের প্যাটার্ন শনাক্ত করুন -- কিন্তু একটি ReDoS-নিরাপদ উপায়ে। একটি একক অক্ষর শ্রেণী ব্যবহার করুন, (a+)+ এর মতো নেস্টেড গোষ্ঠী নয়।
ইঙ্গিত দেখান
বিপজ্জনক (a+)+ একটি সাধারণ a+ দিয়ে প্রতিস্থাপন করুন। ফলাফল একই, কিন্তু নিরাপদ।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
একটি ReDoS-নিরাপদ উপায়ে, স্পেস দ্বারা বিভক্ত শব্দের একটি ক্রম চিনুন। স্ট্রাকচার ব্যবহার করুন `(?:word+space+)*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 প্রচেষ্টার পরে উপলব্ধ