شرح المفهوم
يبدأ الأمن قبل وقت طويل من بناء تطبيق ويب كبير. يبدأ في المرة الأولى التي يقرأ فيها الكود اسم ملف، أو يقبل قيمة مستخدم، أو يقرر ما إذا كان سيثق في المدخلات. في مشاريع المبتدئين، الجزء الخطير ليس التعقيد—بل هو الثقة الزائفة. في هذا الدرس، ستعمل مع سكريبت صغير يقرأ ملفًا من مجلد آمن. الهدف ليس حفظ مصطلحات الأمان. الهدف هو بناء عادة صحية واحدة: لا تثق أبدًا بمسار لمجرد أنه يبدو غير ضار. سترى كيف يمكن للسكريبت أن يحمي نفسه عن طريق التحقق من أين يشير المسار فعليًا قبل فتح أي شيء. ستساعدك هذه العقلية نفسها لاحقًا مع عمليات الرفع، واجهات برمجة التطبيقات (APIs)، والنماذج، وأدوات سطر الأوامر. بحلول نهاية هذا الدرس، يجب أن تكون قادرًا على: • شرح سبب عدم أمان `eval()` للمدخلات غير الموثوقة، • وصف ما يعنيه "اجتياز المسار" (path traversal) بكلمات بسيطة، • إبقاء سكريبت قراءة الملفات داخل مجلد ثابت بدلاً من السماح له بالتجول في أي مكان على النظام. لماذا هذا مهم: الكثير من أكواد المبتدئين تعمل بشكل جيد في المسارات السعيدة (happy paths)، ثم تتعطل لحظة أن تصبح المدخلات فوضوية أو معادية. الكود الموثوق يفترض أن المدخلات السيئة ستصل في النهاية.
أين تضع الكود
- عرّف متغيرات اللون والموضع في الأعلى.
- أنشئ منطق رسم الأشكال أو وضعها في المنتصف.
- اعرض المخرجات (طباعة، لوحة، SVG، أو كتلة منسقة) في النهاية.
مرجع الأوامر
- تعامل مع كل مسار على أنه غير موثوق به حتى تتحقق من أين يشير على القرص.
- استخدم `Path.resolve()` قبل قراءة الملف حتى تتمكن من اكتشاف محاولات الهروب مثل `../secret.txt`.
- لا تستخدم `eval()` أبدًا على نص يتحكم فيه المستخدم؛ تحليل البيانات وتنفيذ الكود ليسا نفس الشيء.
- احتفظ بالتجارب في مجلد مخصص حتى تظل الأخطاء محصورة.
دليل خطوة بخطوة
- شغّل السكريبت وتأكد من أنه يطبع محتويات `notes.txt` من داخل `lesson_workspace`.
- غيّر اسم الملف إلى شيء غير موجود، شغّل مرة أخرى، واقرأ `FileNotFoundError` بعناية.
- جرّب قيمة خطيرة مثل `../outside.txt` وتوقع ما يجب أن يحدث قبل تشغيلها.
- أضف ملفًا آمنًا ثانيًا داخل `lesson_workspace` وتأكد أن الدالة لا تزال تستطيع قراءته بشكل طبيعي.
- اكتب جملة واحدة تشرح لماذا التحقق من المسار المحلول (resolved path) أكثر أمانًا من الثقة في اسم الملف الخام.
تمارين تطبيقية
- بكلماتك الخاصة، اشرح الفرق بين قراءة ملف محلي آمن وتنفيذ نص عشوائي ككود.
- قارن بين `Path` و`os.path` من حيث سهولة القراءة واكتب أي نمط تفضل لسكريبتات المبتدئين.
- ابحث عن مثال واحد عبر الإنترنت لخطأ "اجتياز المسار" (path traversal bug) أو استخدام غير آمن لـ `eval()` ولخّص الدرس في ثلاث جمل بسيطة.
تحديات برمجية
- حدّث الدالة بحيث تسمح فقط بملفات `.txt` وترفض أي شيء آخر برسالة خطأ واضحة.
- أعد كلاً من نص المعاينة وحجم الملف، مع الحفاظ على فحوصات الأمان في مكان واحد.
مهام تمرين صغيرة
- أنشئ `lesson_workspace/` في `.gitignore` حتى لا تسبب ملفاتك التدريبية فوضى في المشروع.
- دوّن قاعدة واحدة تريد تذكرها: لا تثق أبدًا بالمسارات الخام من المدخلات.
- احذف أي تجربة قديمة استخدمت فيها `eval()` لمجرد أنها بدت مريحة.
خطأ شائع
Mixing x and y axes or using wrong coordinate origin causes shapes to appear in unexpected places.
تحدٍ مصغّر من الواقع
Draw one square, one triangle, and one circle, then move X marker 2 steps right and 1 step down.