AzLearn

الاقتباس الآمن

Safe Quoting

مفهوم ~18 دقيقة

الاقتباس الآمن — Safe Quoting

إذا خرجت من مسار Bash بقاعدة واحدة، فلتكن هذه: اقتبس المتغيرات. "$file" أفضل من $file في أغلب الحالات. الاقتباس يمنع word splitting وglobbing غير المقصود. هذا ليس جمالاً أسلوبياً؛ هو أمان. مسار يحتوي مسافة أو نجمة قد يغير سلوك الأمر بالكامل.

الخطر يكبر مع أوامر مثل rm, cp, mv, وrsync. لا تمرر متغيراً غير مقتبس لهذه الأوامر. تحقق أيضاً أن المتغير ليس فارغاً عندما يكون ضرورياً. rm -rf "$target" ما زال خطراً إذا كان target قيمة غير صحيحة، لكنه أقل فوضى من نسخة غير مقتبسة.

الاقتباس ضروري لكنه غير كافٍ — rm -rf

الاقتباس يمنع word-splitting، لكنه لا يمنع القيمة الخاطئة. مثال: rm -rf "$target" آمن من المسافات، لكن ليس من:

  • target="" — يصبح rm -rf بمعامل فارغ أو يعمل على المجلد الحالي
  • target="/" — يحذف كل شيء
  • target غير معرّف — إذا لم تكن set -u مفعّلة، يصبح rm -rf

الحل: تحقق صريح قبل كل أمر تدميري:

script.sh

${target:?message} تُوقف السكربت برسالة إذا كان target فارغاً أو غير معرّف، حتى بدون set -u. الطبقة الثانية تضيف حماية ضد القيم الخطرة المعرّفة.

مثال آمن

script.sh

لا يظهر الخطر في echo غالباً، لكنه يظهر مع الأوامر التي تفسر المعاملات. لذلك تعود على الاقتباس حتى في الأمثلة الصغيرة.

متى لا تقتبس؟

هناك حالات قليلة مثل glob مقصود: for file in *.md; do. هنا لا تقتبس *.md لأنك تريد من shell توسيع النمط. لكن داخل الحلقة، اقتبس "$file".

تحدي — Challenge