অ্যান্টিপ্যাটার্ন: RegularExpressionProtection নীতিতে লোভী কোয়ান্টিফায়ার ব্যবহার করুন

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

RegularExpressionProtection পলিসিটি এমন রেগুলার এক্সপ্রেশন নির্ধারণ করে, যা রানটাইমে ইনপুট প্যারামিটার বা ফ্লো ভেরিয়েবলের উপর মূল্যায়ন করা হয়। সাধারণত SQL বা JavaScript ইনজেকশনের মতো কন্টেন্ট থ্রেট থেকে সুরক্ষা পেতে, অথবা ইমেল অ্যাড্রেস বা URL-এর মতো ত্রুটিপূর্ণ রিকোয়েস্ট প্যারামিটার যাচাই করার জন্য এই পলিসিটি ব্যবহার করা হয়।

রিকোয়েস্ট পাথ, কোয়েরি প্যারামিটার, ফর্ম প্যারামিটার, হেডার, এক্সএমএল এলিমেন্ট (XPath ব্যবহার করে সংজ্ঞায়িত এক্সএমএল পেলোডে), এবং জেএসওএন অবজেক্ট অ্যাট্রিবিউটের (JSONPath ব্যবহার করে সংজ্ঞায়িত জেএসওএন পেলোডে) জন্য রেগুলার এক্সপ্রেশন সংজ্ঞায়িত করা যেতে পারে।

নিম্নলিখিত উদাহরণ RegularExpressionProtection পলিসিটি ব্যাকএন্ডকে SQL ইনজেকশন আক্রমণ থেকে রক্ষা করে:

<!-- /antipatterns/examples/greedy-1.xml -->
<RegularExpressionProtection async="false" continueOnError="false" enabled="true"
  name="RegexProtection">
    <DisplayName>RegexProtection</DisplayName>
    <Properties/>
    <Source>request</Source>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <QueryParam name="query">
      <Pattern>[\s]*(?i)((delete)|(exec)|(drop\s*table)|
        (insert)|(shutdown)|(update)|(\bor\b))</Pattern>
    </QueryParam>
</RegularExpressionProtection>

অ্যান্টিপ্যাটার্ন

ডিফল্ট কোয়ান্টিফায়ারগুলো ( * , + , এবং ? ) স্বভাবগতভাবে গ্রিডি: এগুলো সম্ভাব্য দীর্ঘতম সিকোয়েন্স দিয়ে মেলানো শুরু করে। যখন কোনো মিল খুঁজে পাওয়া যায় না, তখন এগুলো প্যাটার্নটি মেলানোর জন্য ধীরে ধীরে পেছনের দিকে যেতে থাকে। যদি প্যাটার্নের সাথে মিলে যাওয়া স্ট্রিংটি খুব ছোট হয়, তাহলে গ্রিডি কোয়ান্টিফায়ার ব্যবহার করলে প্রয়োজনের চেয়ে বেশি সময় লাগতে পারে। পেলোড বড় হলে (কয়েক দশ বা শত কিলোবাইটের) এটি বিশেষভাবে সত্যি।

নিম্নলিখিত উদাহরণ এক্সপ্রেশনটিতে একাধিকবার .* ব্যবহার করা হয়েছে, যেগুলো গ্রিডি অপারেটর:

<Pattern>.*Exception in thread.*</Pattern>

এই উদাহরণে, RegularExpressionProtection পলিসিটি প্রথমে সম্ভাব্য দীর্ঘতম সিকোয়েন্স—অর্থাৎ পুরো স্ট্রিংটি—ম্যাচ করার চেষ্টা করে। যদি কোনো ম্যাচ খুঁজে না পাওয়া যায়, তাহলে পলিসিটি ধীরে ধীরে ব্যাকট্র্যাক করে। যদি ম্যাচিং স্ট্রিংটি পেলোডের শুরু বা মাঝের কাছাকাছি থাকে, তাহলে .* .*? এর মতো রিলাক্ট্যান্ট কোয়ালিফায়ার বা (তুলনামূলকভাবে কম ব্যবহৃত) .*+ এর মতো পজেসিভ কোয়ান্টিফায়ারের চেয়ে অনেক বেশি সময় এবং প্রসেসিং পাওয়ার লাগতে পারে।

রিলাক্ট্যান্ট কোয়ান্টিফায়ার (যেমন X*? , X+? , X?? ) পেলোডের শুরু থেকে একটিমাত্র অক্ষর মেলানোর চেষ্টা করে এবং ধীরে ধীরে অক্ষর যোগ করতে থাকে। পজেসিভ কোয়ান্টিফায়ার (যেমন X?+ , X*+ , X++ ) সম্পূর্ণ পেলোডটিকে কেবল একবার মেলানোর চেষ্টা করে।

উপরোক্ত প্যাটার্নটির জন্য নিম্নলিখিত নমুনা পাঠ্য দেওয়া হলো:

Hello this is a sample text with Exception in thread
with lot of text after the Exception text.

এই ক্ষেত্রে গ্রিডি .* ব্যবহার করা পারফরম্যান্স-বান্ধব নয়। .*Exception in thread.* প্যাটার্নটি ম্যাচ করতে ১৪১টি ধাপ লাগে। এর পরিবর্তে যদি আপনি .*?Exception in thread.* প্যাটার্নটি (যেটি একটি রিলাক্ট্যান্ট কোয়ান্টিফায়ার ব্যবহার করে) ব্যবহার করতেন, তাহলে ফলাফল হতো মাত্র ৫৫ ধাপ।

প্রভাব

RegularExpressionProtection পলিসির সাথে ওয়াইল্ডকার্ড ( * ) এর মতো গ্রিডি কোয়ান্টিফায়ার ব্যবহার করলে নিম্নলিখিত সমস্যাগুলো হতে পারে:

  • মাঝারি আকারের পেলোডের (১ মেগাবাইট পর্যন্ত) জন্য এপিআই অনুরোধের সামগ্রিক লেটেন্সি বৃদ্ধি।
  • RegularExpressionProtection পলিসির কার্যকারিতা সম্পন্ন হতে বেশি সময় লাগে।
  • এজ রাউটারে পূর্বনির্ধারিত টাইমআউট সময় শেষ হয়ে গেলে, বড় পেলোড (>1MB) সহ API অনুরোধগুলি 504 গেটওয়ে টাইমআউট ত্রুটির কারণে ব্যর্থ হচ্ছে।
  • বিপুল পরিমাণ প্রসেসিংয়ের কারণে মেসেজ প্রসেসরগুলোতে সিপিইউ-এর ব্যবহার বেড়ে যাচ্ছে, যা পরবর্তীতে অন্যান্য এপিআই অনুরোধগুলোকেও প্রভাবিত করতে পারে।

সর্বোত্তম অনুশীলন

  • RegularExpressionProtection পলিসিযুক্ত রেগুলার এক্সপ্রেশনে . .* এর পরিবর্তে, যেখানে সম্ভব . .*? এর মতো রিলাক্ট্যান্ট কোয়ান্টিফায়ার অথবা .*+ এর মতো পজেসিভ কোয়ান্টিফায়ার (যা তুলনামূলকভাবে কম ব্যবহৃত হয়) ব্যবহার করুন।

আরও পড়ুন