Antipattern: استخدام محددات كمية كبيرة في سياسة RegionExpressionProtection

أنت تعرض مستندات Apigee Edge.
انتقل إلى مستندات Apigee X.
معلومات

تحدد سياسة نش استثناء الطرق العادية التعبيرات العادية التي يتم تقييمها على وقت التشغيل على معلمات الإدخال أو متغيرات التدفق. تستخدم عادةً هذه السياسة للحماية من تهديدات المحتوى، مثل إدخال SQL أو JavaScript، أو للتحقّق من معلَمات الطلب غير الصحيحة مثل عناوين البريد الإلكتروني أو عناوين URL.

ويمكن تحديد التعبيرات العادية لمسارات الطلب، ومعلمات طلب البحث، ومعلمات النموذج، عناوين وعناصر XML (في حمولة XML محددة باستخدام XPath) وسمات كائن JSON (بتنسيق JSON الحمولة المحددة باستخدام JSONPath).

في المثال التالي، تحمي سياسة PrimaryExpressionProtection الواجهة الخلفية من 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>

نقوش

مقاييس الكمية التلقائية (* و+ و?) طموحة في الطبيعة: تبدأ في التطابق مع أطول تسلسل ممكن. عندما لا يتم العثور على أي تطابق، التراجع تدريجيًا لمحاولة مطابقة النمط. إذا كانت السلسلة الناتجة التي تطابق النمط قصير جدًا، فإن استخدام محددات الكمية الجشعة قد يستغرق وقتًا أطول من اللازم. يعد ذلك خاصةً true إذا كانت الحمولة كبيرة (بالعشرات أو المئات من الكيلوبايت).

يستخدم المثال التالي مثيلات متعددة من .*، وهي طمعة العوامل:

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

في هذا المثال، تحاول السياسة العادية للتعبير العادي أولاً مطابقة أطول فترة ممكنة. التسلسل - السلسلة بأكملها. وفي حال عدم العثور على أي تطابق، يتم التراجع عن السياسة. تدريجيًا. إذا كانت السلسلة المطابقة قريبة من بداية الحمولة أو منتصفها، فعندئذ يمكن استخدام أداة تحديد الكمية الجشعة مثل .* يمكن أن تستغرق وقتًا ومعالجة أكبر بكثير من صعيد المؤهلات مثل .*? أو (الأقل شيوعًا) محددات الكمية مثل .*+

تبدأ محدِّدات الكمية المتباينة (مثل 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.* 141 خطوة للمطابقة. إذا استخدمت النمط .*?Exception in thread.* (التي تستخدم مُحدِّد الكمية المتردد) بدلاً من ذلك، ستكون النتيجة على 55 خطوة فقط.

التأثير

استخدام محددات الكمية الجسيمة مثل أحرف البدل (*) مع يمكن أن تؤدي سياسة Standard ExpressionProtection إلى:

  • زيادة في وقت الاستجابة الإجمالي لطلبات البيانات من واجهة برمجة التطبيقات بالنسبة إلى حجم حمولة معتدل (يصل إلى 1 ميغابايت)
  • وقت أطول لإكمال تنفيذ سياسة PrimaryExpressionProtection
  • تعذُّر تنفيذ طلبات واجهة برمجة التطبيقات ذات الحمولات الكبيرة (أكبر من 1 ميغابايت) مع ظهور أخطاء مهلة 504 للمدخل في حال انقضاء مدة المهلة المحدَّدة مسبقًا على جهاز توجيه Edge
  • يتم استخدام وحدة المعالجة المركزية (CPU) بشكل مرتفع في معالِجات معالجة الرسائل بسبب المعالجة الكبيرة التي يمكن أن تزيد التأثير في طلبات واجهة برمجة التطبيقات الأخرى

أفضل ممارسة

  • تجنّب استخدام محددات الكمية الجسيمة مثل .* في التعبيرات العادية مع سياسة حماية الحقوق العادية. بدلاً من ذلك، استخدم محددات كميّات مترددة مثل .*? أو محددات الكمية المملوكة مثل .*+ (الأقل شيوعًا) حيثما ممكن.

محتوى إضافي للقراءة