Secure Code Review : Critical process you need to know
تعد مراجعة التعليمات البرمجية الآمنة عملية مهمة في تطوير البرامج لتحديد الثغرات الأمنية المحتملة في التعليمات البرمجية والتخفيف من حدتها. هنا ، سأزودك بدليل خطوة بخطوة حول كيفية إجراء مراجعة آمنة للرمز ، إلى جانب بعض الأمثلة على مشكلات الأمان الشائعة والإصلاحات المقابلة لها.
دليل تفصيلي خطوة بخطوة لمراجعة التعليمات البرمجية الآمنة:
- افهم المتطلبات: تعرف على متطلبات المشروع ومواصفاته وإرشادات الأمان.
- اختر الأدوات الصحيحة: استخدم أدوات مراجعة التعليمات البرمجية التي يمكن أن تساعد في تحديد الثغرات الأمنية تلقائيًا. تتضمن بعض الأدوات الشائعة SAST (اختبار أمان التطبيق الثابت) وأدوات تحليل التعليمات البرمجية مثل SonarQube و Fortify و Checkmarx.
- فحص المصادقة والترخيص: راجع كيفية تنفيذ مصادقة المستخدم والترخيص. تأكد من حماية العمليات والموارد الحساسة بشكل صحيح.
مثال - المصادقة غير الآمنة:
// Insecure code - Storing passwords in plain text
public boolean authenticateUser(String username, String password) {
String storedPassword = database.getPasswordByUsername(username);
return password.equals(storedPassword);}
إصلاح - استخدام التجزئة المملحة لكلمات المرور:
// Secure code - Using salted hashing for password storage
public boolean authenticateUser(String username, String password) {
String storedPasswordHash = database.getPasswordHashByUsername(username);
String salt = database.getSaltByUsername(username);
String hashedPassword = hashFunction(password + salt);
return hashedPassword.equals(storedPasswordHash);}
- تحقق من التحقق من صحة الإدخال: ابحث عن مشكلات التحقق من صحة الإدخال التي قد تؤدي إلى إدخال التعليمات البرمجية أو هجمات التلاعب بالبيانات.
مثال - ثغرة أمنية في إدخال SQL:
# كود غير آمن - ثغرة أمنية لإدخال SQL هي get_user_by_id (معرف المستخدم): الاستعلام = "حدد * من المستخدمين حيث المعرف = '" + user_id + "'؛" النتيجة = execute_sql_query (استعلام) إرجاع النتيجة
إصلاح - استخدام الاستعلامات ذات المعاملات:
# رمز آمن - استخدام الاستعلامات ذات المعلمات def get_user_by_id (معرف المستخدم): الاستعلام = "SELECT * من المستخدمين WHERE id = %s؛" النتيجة = execute_sql_query (استعلام، (user_id،)) إرجاع النتيجة
- معالجة حالات الخطأ: تأكد من أن رسائل الخطأ لا تعرض المعلومات الحساسة ويتم التعامل معها بأمان.
مثال - تسرب المعلومات:
// رمز غير آمن - الكشف عن معلومات خطأ حساسة إذا (! isAuthorized (مستخدم)) {throw new SecurityException ("وصول غير مصرح به للمستخدم:" + user.getName ())؛ }
إصلاح - استخدام رسائل الخطأ العامة:
// Secure code - استخدام رسائل خطأ عامة إذا (! isAuthorized (مستخدم)) {throw new SecurityException ("وصول غير مصرح به") ؛ }
- مراجعة تخزين البيانات وتشفيرها: تحقق من كيفية تخزين البيانات الحساسة وتأكد من استخدام طرق التشفير المناسبة.
مثال - ضعف تشفير البيانات:
# رمز غير آمن - باستخدام خوارزمية تشفير ضعيفة من التشفير.
إصلاح - استخدام خوارزمية تشفير قوية:
# كود آمن - استخدام خوارزمية تشفير قوية (AES) من cryptography.hazmat.primitives استيراد تجزئات من cryptography.hazmat.primitives.kdf.pbkdf2 استيراد PBKDF2HMAC من cryptography.hazmat.primitives.kdf.pbkdf2 import_default_defography.kdf. ، password): salt = b'salt_ 'kdf = PBKDF2HMAC (خوارزمية = hashes.SHA256 ()، length = 32، salt = salt، iterations = 100000، backend = default_backend ()) key = base64.urlsafe_b64encode (kdf.derive (password)) تشفير افتراضي = Cipher (algorithms) ryptor = cipher.encryptor () إرجاع encryptor.update (البيانات) + encryptor.finalize () def decrypt_data (encrypted_data ، password): salt = b'salt_ 'kdf = PBKDF2HMAC (الخوارزمية = التجزئة. kdf.derive (كلمة المرور)) التشفير = التشفير (الخوارزميات.AES (مفتاح) ، الأوضاع. CFB (iv) ، الخلفية = default_backend ()) decryptor = cipher.decryptor () إرجاع decryptor.update (encrypted_data) + decryptor.finalize ()
- تحقق من وجود ثغرات في إدخال التعليمات البرمجية: ابحث عن الثغرات الأمنية المحتملة مثل تنفيذ التعليمات البرمجية عن بعد (RCE) وإدخال الأوامر.
مثال - ثغرة أمنية في حقن الأوامر:
# كود غير آمن - ثغرة أمنية في إدخال الأمر def run_shell_command (أمر): os.system (أمر)
إصلاح - استخدام طرق تنفيذ الأوامر المناسبة:
# Secure code - تجنب ثغرة أمنية في إدخال الأوامر عملية الاستيراد الفرعية def run_shell_command (الأمر): subprocess.run (الأمر ، shell = True)
- مراجعة مكتبات الطرف الثالث: تحقق من أمان مكتبات الجهات الخارجية المستخدمة في المشروع. تأكد من تحديثها وعدم وجود ثغرات أمنية معروفة.
- تحليل إدارة الجلسة: تحقق من كيفية إدارة الجلسات وإنشاء الرموز المميزة للجلسة بشكل آمن.
مثال - إنشاء رمز جلسة غير آمن:
// رمز غير آمن - إنشاء رمز جلسة غير آمن عام String GeneratorSessionToken () {return UUID.randomUUID (). toString ()؛ }
إصلاح - استخدام مُنشئ رقم عشوائي آمن:
// Secure code - استخدام إنشاء الرمز المميز للجلسة الآمنة public String createSessionToken () {SecureRandom random = new SecureRandom ()؛ بايت [] tokenBytes = بايت جديد [32] ؛ random.nextBytes (tokenBytes) ؛ إرجاع Base64.getUrlEncoder (). withoutPadding (). encodeToString (tokenBytes) ؛ }
- مراجعة معالجة الأخطاء: تأكد من تنفيذ معالجة الأخطاء بشكل آمن وعدم كشف المعلومات الحساسة.
- تحقق من وجود ثغرات أمنية في البرمجة النصية عبر المواقع (XSS): راجع كيفية عرض مدخلات المستخدم في التطبيق وتأكد من الهروب أو التطهير المناسب.
مثال - ثغرة أمنية في البرمجة النصية عبر المواقع:
<!-- Insecure code - XSS vulnerability -->
<div>مرحباً، <%= user.getName() %></div>
الإصلاح - استخدام الهروب المناسب:
<!-- Secure code - Escaping user input to prevent XSS -->
<div>مرحباً، <%= encodeHtml(user.getName()) %></div>
- اختبار شروط الحدود: تحقق من أن الكود يتعامل مع شروط الحدود بشكل مناسب ، مثل أطوال الإدخال القصوى وحدود الصفيف.
يجب أن تمنحك هذه الأمثلة والإرشادات نقطة بداية لإجراء مراجعات تعليمات برمجية آمنة. من الضروري مواكبة أحدث ممارسات الأمان والحصول على فهم شامل للغات البرمجة وأطر العمل المستخدمة. يجب أن تكون مراجعات الكود المنتظمة واختبار الأمان المستمر جزءًا لا يتجزأ من دورة حياة تطوير البرامج للحفاظ على قاعدة تعليمات برمجية آمنة.
0 Comments