أمان تطبيقات Kotlin: أهم 10 ثغرات أمنية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة



Kotlin هي لغة برمجة حديثة تُستخدم بنشاط لتطوير تطبيقات Android والحلول الخادمية (Ktor, Spring Boot) والمشاريع عبر المنصات. على الرغم من كتابتها الصارمة وأمانها من القيم الفارغة (null-safety)، إلا أن المطورين غالبًا ما يرتكبون أخطاء تؤدي إلى ثغرات أمنية خطيرة. في هذه المقالة، سنستعرض أهم 10 ثغرات أمنية في تطبيقات Kotlin، بناءً على معايير OWASP، ونوضح كيفية تجنبها.



ستكون المقالة مفيدة لكل من مطوري Kotlin المبتدئين وذوي الخبرة الراغبين في رفع مستوى أمان مشاريعهم.



1. حقن SQL (SQL Injection)



المشكلة: إدخال كود SQL ضار عبر إدخال المستخدم.



مثال على كود ضعيف:



// ضعيف! لا تستخدم دمج السلاسل النصيةfun getUserById(id: String): User? {    val query = "SELECT * FROM users WHERE id = '$id'"    val result = connection.createStatement().executeQuery(query)    return result.toUser()}


الحل: استخدم الاستعلامات المُعلمة (PreparedStatement).



// آمنfun getUserById(id: String): User? {    val query = "SELECT * FROM users WHERE id = ?"    val preparedStatement = connection.prepareStatement(query)    preparedStatement.setString(1, id)    val result = preparedStatement.executeQuery()    return result.toUser()}


2. البرمجة النصية عبر المواقع (XSS)



المشكلة: إدراج كود JavaScript ضار في صفحة الويب.



مثال على كود ضعيف (Ktor):



// ضعيف! لا تقم بهروب المخرجاتget("/search") {    val query = call.parameters["q"] ?: ""    call.respondHtml {        h1 { +"نتائج البحث لـ: $query" } // XSS!    }}


الحل: استخدم هروب HTML (مثل kotlinx.html مع الهروب).



// آمنimport kotlinx.html.escapeHtml

get("/search") { val query = call.parameters["q"] ?: "" val safeQuery = query.escapeHtml() call.respondHtml { h1 { +"نتائج البحث لـ: $safeQuery" } }}


3. تخزين كلمات المرور غير الآمن



المشكلة: تخزين كلمات المرور بنص واضح أو باستخدام تجزئات ضعيفة (MD5, SHA-1).



مثال على كود ضعيف:



// ضعيف! MD5 غير مناسب لكلمات المرورfun saveUser(password: String) {    val hash = MessageDigest.getInstance("MD5").digest(password.toByteArray())    // حفظ التجزئة في قاعدة البيانات}


الحل: استخدم bcrypt أو scrypt أو Argon2.



// آمن (باستخدام مكتبة jbcrypt)import org.mindrot.jbcrypt.BCrypt

fun hashPassword(password: String): String { return BCrypt.hashpw(password, BCrypt.gensalt(12))}

fun checkPassword(password: String, hashed: String): Boolean { return BCrypt.checkpw(password, hashed)}


4. تسريب البيانات السرية عبر السجلات



المشكلة: تسجيل كلمات المرور والرموز وأرقام البطاقات.



مثال على كود ضعيف:



// ضعيف! نسجل بيانات حساسةfun login(username: String, password: String) {    log.info("محاولة تسجيل دخول: username=$username, password=$password")}


الحل: استخدم المرشحات أو الإخفاء.



// آمنfun login(username: String, password: String) {    log.info("محاولة تسجيل دخول: username=$username")    // لا نسجل كلمة المرور}


5. إلغاء التسلسل غير الآمن



المشكلة: تنفيذ كود عشوائي عند إلغاء تسلسل بيانات غير موثوقة.



مثال على كود ضعيف:



// ضعيف! إلغاء تسلسل بدون تحققfun process                

المدونات

توصيات الكتب