Skip to content

الفصل 34: أمن البرمجيات

مقدمة

الأمن ليس ميزة اختيارية — بل ضرورة أساسية في كل برنامج. هذا الفصل يغطي أهم مبادئ البرمجة الآمنة.

التحقق من المدخلات

قاعدة ذهبية: لا تثق بأي مدخل خارجي

sad
دالة تحقق_بريد(بريد)
    إذا (نوع(بريد) != "نص")
        ارمي "البريد يجب أن يكون نصاً"
    نهاية
    إذا (طول(بريد) < 5 أو طول(بريد) > 254)
        ارمي "طول البريد غير صالح"
    نهاية
    إذا (ليس يحتوي(بريد، "@"))
        ارمي "البريد يجب أن يحتوي @"
    نهاية
    ارجع صحيح
نهاية

دالة تحقق_عمر(عمر)
    إذا (نوع(عمر) != "رقم")
        ارمي "العمر يجب أن يكون رقماً"
    نهاية
    إذا (عمر < 0 أو عمر > 150)
        ارمي "العمر غير منطقي"
    نهاية
    ارجع صحيح
نهاية

تنظيف المدخلات

منع حقن الأكواد

sad
دالة تنظيف_نص(نص_المستخدم)
    متغير نظيف = استبدل(نص_المستخدم، "<"، "&lt;")
    نظيف = استبدل(نظيف، ">"، "&gt;")
    نظيف = استبدل(نظيف، "\""، "&quot;")
    نظيف = استبدل(نظيف، "'"، "&#39;")
    ارجع نظيف
نهاية

# الاستخدام
متغير مدخل = "<script>alert('hack')</script>"
متغير آمن = تنظيف_نص(مدخل)
aطبع_سطر(آمن)  # &lt;script&gt;alert(&#39;hack&#39;)&lt;/script&gt;

إدارة كلمات المرور

sad
دالة تحقق_قوة_كلمة_مرور(كلمة_مرور)
    متغير أخطاء = []
    
    إذا (طول(كلمة_مرور) < 8)
        أخطاء = أخطاء + ["يجب أن تكون 8 أحرف على الأقل"]
    نهاية
    
    متغير فيها_رقم = خطأ
    متغير فيها_حرف_كبير = خطأ
    
    لكل حرف في كلمة_مرور
        إذا (حرف >= "0" و حرف <= "9")
            فيها_رقم = صحيح
        نهاية
    نهاية
    
    إذا (ليس فيها_رقم)
        أخطاء = أخطاء + ["يجب أن تحتوي رقماً واحداً على الأقل"]
    نهاية
    
    إذا (طول(أخطاء) > 0)
        ارجع {"صالح": خطأ، "أخطاء": أخطاء}
    نهاية
    ارجع {"صالح": صحيح، "أخطاء": []}
نهاية

مبدأ الحد الأدنى من الصلاحيات

sad
صنف مستخدم
    خاص متغير _اسم
    خاص متغير _دور
    
    باني(اسم، دور)
        هذا._اسم = اسم
        هذا._دور = دور
    نهاية
    
    دالة هل_مسموح(إجراء)
        طابق (هذا._دور)
            عندما "مشرف":
                ارجع صحيح
            عندما "محرر":
                ارجع إجراء == "قراءة" أو إجراء == "كتابة"
            عندما "قارئ":
                ارجع إجراء == "قراءة"
            افتراضي:
                ارجع خطأ
        نهاية
    نهاية
نهاية

# الاستخدام
متغير م = جديد مستخدم("أحمد"، "محرر")
aطبع_سطر(م.هل_مسموح("قراءة"))   # صحيح
اطبع_سطر(م.هل_مسموح("حذف"))    # خطأ

قائمة فحص الأمن

البندالتحقق
التحقق من المدخلات✅ كل مدخل خارجي
تنظيف المخرجات✅ قبل العرض
إدارة الأخطاء✅ لا تكشف تفاصيل داخلية
الصلاحيات✅ الحد الأدنى
كلمات المرور✅ قوية ومشفرة

تمرين

أنشئ نظام تسجيل دخول آمن مع:

  • تحقق من البريد الإلكتروني
  • فحص قوة كلمة المرور
  • قفل الحساب بعد 3 محاولات فاشلة
الحل
sad
صنف نظام_تسجيل
    خاص متغير _مستخدمين = {}
    خاص متغير _محاولات = {}
    
    دالة تسجيل(بريد، كلمة_مرور)
        تحقق_بريد(بريد)
        متغير قوة = تحقق_قوة_كلمة_مرور(كلمة_مرور)
        إذا (ليس قوة["صالح"])
            ارمي "كلمة المرور ضعيفة: " + قوة["أخطاء"][0]
        نهاية
        هذا._مستخدمين[بريد] = كلمة_مرور
        هذا._محاولات[بريد] = 0
    نهاية
    
    دالة دخول(بريد، كلمة_مرور)
        إذا (هذا._محاولات[بريد] >= 3)
            ارمي "الحساب مقفل"
        نهاية
        إذا (هذا._مستخدمين[بريد] == كلمة_مرور)
            هذا._محاولات[بريد] = 0
            ارجع صحيح
        وإلا
            هذا._محاولات[بريد] = هذا._محاولات[بريد] + 1
            ارمي "بيانات خاطئة. محاولات متبقية: " + (3 - هذا._محاولات[بريد])
        نهاية
    نهاية
نهاية

مُرخَّص بموجب رخصة MIT