محتويات الدورة

GitHub Actions / المشاركة والسلطة المحدودة / الدرس 9

المدخل غير الموثوق وحدود حقن النص

أبق نص الحدث بيانات عبر التعبير والصدفة والتحقق التطبيقي.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • معرفة الإحلال غير الآمن في run.
  • استخدام وسيط بيئة وتحقق مجال دون ادعاء تعقيم عام.

قد يتحكم مهاجم بنص الحدث

قد تحتوي عناوين طلبات الدمج وأسماء الفروع وأجسام القضايا وحقول أخرى نصوصاً متعددة الأسطر وعلامات ترقيم غير متوقعة. يراها الكاتب أحياناً أسماء بريئة، لكن التعبير المدرج في run يصبح جزءاً من البرنامج الذي تحلله الصدفة. ينبغي ألا تمنح خطوة عرض عنوان Parcel مساهمًا قدرة إضافة صياغة تنفيذية. حدد منشأ كل قيمة والمفسر الذي سيستهلكها. يمكن لملف سير موثوق تماماً أن ينفذ نصاً غير موثوق إذا بنى البرنامج من قيم الحدث دون الحفاظ على فصل البيانات عن التعليمات.

لا تبن شيفرة من نص الحدث

يضع النمط غير الآمن التعبير مباشرة داخل نص صدفة مقتبس ويفترض أن الاقتباس المحيط سيحتوي كل قيمة. يحدث إحلال التعبير قبل تحليل الصدفة، ولذلك قد تغير علامات اقتباس داخل القيمة بنية البرنامج. لا يقدم الدرس حمولة مؤذية ولا ينفذ استغلالاً. المبدأ الآمن محدد: أبق النص البرمجي ثابتاً ومرر القيمة بقناة بيانات مع اقتباس الوسيط الصحيح. ثم تحقق من ملاءمتها لمجال المستهلك التالي، ولا تعتبر أن الاقتباس يجعل كل استخدام ممكن للنص آمناً تلقائياً.

مرر القيمة كوسيط مقتبس

يسند المقطع عنوان طلب الدمج إلى متغير بيئة ثم يمرره لصيغة printf ثابتة. لا تعيد الصدفة تحليل محتوى المتغير المقتبس كصياغة جديدة للبرنامج. يحمي ذلك حد العرض المعين، ولا يجعل القيمة مناسبة لكل استعمال. إذا استُخدمت لاحقاً خياراً أو مساراً أو تعبيراً نمطياً أو SQL أو اسم أمر، فستحتاج عقداً خاصاً بذلك الموضع. لا تمررها إلى eval أو مفسر آخر وتفترض بقاء الحماية السابقة. تراجع السلامة عند كل حد تفسير، وليس مرة واحدة عند استقبال النص.

yaml نص ثابت ووسيط بيانات
steps:
  - name: Report proposal title as data
    env:
      PARCEL_TITLE: ${{ github.event.pull_request.title }}
    shell: bash
    run: printf "%s\n" "$PARCEL_TITLE"

مقطع خطوة لحدث معين لا يُنفذ ولا يحوي حمولة ضارة ولا يزعم صلاحية العنوان للملفات والأوامر والقرارات المميزة.

تحقق من المجال المقصود

إذا كانت الخطوة التالية تتطلب اسم تجهيز لا نصاً حراً، فاستخدم قائمة معرفات مدعومة وارفض ما عداها. يوضح البرنامج الكامل فحص مجال ضيق دون تشغيل صدفة. ليس معقماً عاماً للنصوص ولا ينبغي تحويله إلى قائمة متنامية من محارف ممنوعة. يسهل عادة تعريف اللغة المسموحة ومراجعتها أكثر من تخمين كل تمثيل خطر. افصل التفويض عن هذا الفحص؛ فالاسم الصحيح يدل على أن القيمة من المجال المدعوم، ولا يمنح صاحبها حق الوصول إلى الإنتاج أو تشغيل عملية ذات صلاحيات مرتفعة.

python عقد ضيق لاسم التجهيز
allowed = {"parcel-a", "parcel-b"}
def fixture(value):
    if value not in allowed:
        raise ValueError("unsupported fixture")
    return value
for value in ["parcel-a", "unknown"]:
    try:
        print(fixture(value))
    except ValueError as error:
        print(error)
الناتج المتوقع
parcel-a
unsupported fixture

القيم افتراضية ولا ينفذ أمر. تتحقق القائمة من هذا المجال فقط لا تهرب كل نص ولا تفوضه.

تتبع المستهلكين اللاحقين

راجع مدخلات الإجراءات والنصوص المساعدة إلى جانب مقاطع run الظاهرة. قد يدمج إجراء خارجي مدخله داخلياً في صدفة، وقد يصبح تقرير آمن غير آمن عند نسخه إلى أمر آخر. افحص التنفيذ وثبّت هوية اعتماد مراجعة. انتبه أيضاً إلى حقن ملفات المخرجات والبيئة عندما يُكتب نص حر كسجل تحكم. احفظ تمييزاً واضحاً بين النصوص الحرة والبيانات المنظمة والمحتوى التنفيذي. يجب أن يصل تتبع البيانات إلى المفسر أو الواجهة النهائية، لا أن يتوقف عند أول متغير اقتُبس بصورة صحيحة في المستدعي.

الأخطاء الشائعة وإصلاحها

يُدرج عنوان الطلب مباشرة في النص.

لماذا يحدث؟
يحول الإحلال غير الموثوق إلى مصدر برنامج.
كيف تصلحه؟
مرره كبيانات ببيئة أو واجهة منظمة.
كيف تتجنب تكراره؟
تتبع كل مفسر وراجع نمط النص الثابت.

تمرر قيمة مقتبسة لاحقاً إلى eval.

لماذا يحدث؟
يعيد مفسر لاحق البيانات كشيفرة.
كيف تصلحه؟
أزل التقييم الديناميكي وثبّت العملية والمعلمات.
كيف تتجنب تكراره؟
راجع المسار كله والإجراءات المساعدة.

يُعد اسم صحيح تفويض إنتاج.

لماذا يحدث؟
اختلطت صحة المجال بالسلطة.
كيف تصلحه؟
طبق تفويض المستودع والبيئة والهدف مستقلاً.
كيف تتجنب تكراره؟
أظهر التحقق والأذونات صراحة.

اختبر فهمك

1. هل ينفذ printf "%s" "$VALUE" صياغة داخل VALUE؟

اعرض الحل المشروح

ليس بذاته وفق Bash المعلن؛ التوسيع وسيط مقتبس لأمر ثابت ولا يعاد تفسيره. لا يبرر ذلك eval أو استعماله خياراً أو مساراً بلا تحقق.

2. يمرر YAML مدخلاً بأمان ويجمعه الإجراء في نص. أين العيب؟

اعرض الحل المشروح

في حد التفسير الداخلي للإجراء. راجعه أو استبدله بنص ثابت ووسائط بيانات وتحقق. لا يصلح استدعاء آمن تنفيذاً تالياً غير آمن.

أهم ما تعلمته

  • أبعد نص الحدث عن بناء الشيفرة.
  • تحقق من المجال وتتبع المفسر النهائي.

المراجع الرسمية