أمان تطبيقات Swift: أهم 10 ثغرات لنظامي iOS/macOS

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

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

ابدأ الدورة

مقدمة: لماذا تعتبر أمان تطبيقات Swift أمرًا بالغ الأهمية

Swift هي لغة برمجة قوية وحديثة طورتها Apple لتطوير التطبيقات لأنظمة iOS وmacOS وwatchOS وtvOS. على الرغم من آليات الأمان المدمجة (ARC، التعامل الآمن مع الذاكرة، الأنواع الاختيارية)، فإن آلاف التطبيقات تقع ضحية للهجمات سنويًا بسبب أخطاء المطورين. وفقًا لتقرير OWASP Mobile Top 10، تنشأ معظم الثغرات الأمنية في التطبيقات المحمولة من جانب العميل. في هذه المقالة، سنستعرض 10 من أكثر الثغرات الأمنية شيوعًا في تطبيقات Swift، ونقدم أمثلة على الكود، ونوضح كيفية تجنبها.



1. تخزين البيانات غير الآمن (Insecure Data Storage)

المشكلة

غالبًا ما يقوم المطورون بحفظ البيانات الحساسة (الرموز المميزة، كلمات المرور، مفاتيح API) في UserDefaults أو ملفات Plist أو Core Data دون تشفير. على الأجهزة التي تم كسر حمايتها (jailbroken)، يمكن للمهاجم الوصول إليها بسهولة.

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

// كود ضعيفUserDefaults.standard.set("secret_token_123", forKey: "api_token")UserDefaults.standard.set("password123", forKey: "user_password")

الحل

استخدم Keychain لتخزين البيانات الحساسة. توفر Swift أغلفة مناسبة مثل KeychainSwift أو إطار عمل Security.

// تخزين آمن باستخدام Keychainimport KeychainSwift

let keychain = KeychainSwift()keychain.set("secret_token_123", forKey: "api_token")keychain.set("password123", forKey: "user_password", withAccess: .accessibleWhenUnlockedThisDeviceOnly)


2. حقن الكود وحقن SQL (Code Injection & SQL Injection)

المشكلة

إذا كان تطبيقك يستخدم SQLite أو Core Data مع NSPredicate أو WebView لعرض محتوى الويب، يمكن للمهاجم حقن كود ضار من خلال إدخال المستخدم.

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

// استعلام SQLite ضعيفlet userInput = "1' OR '1'='1"let query = "SELECT * FROM users WHERE id = '\\(userInput)'"

الحل

استخدم الاستعلامات المعلمية (parameterized queries) أو NSPredicate مع بدائل آمنة.

// استعلام آمن مع معلماتlet query = "SELECT * FROM users WHERE id = ?"let statement = try db.prepare(query)try statement.bind(1, userInput)


3. الاتصال الشبكي غير المحمي (Insecure Network Communication)

المشكلة

استخدام HTTP بدلاً من HTTPS، تجاهل شهادات SSL (App Transport Security) أو إرسال البيانات دون تشفير.

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

// كود ضعيف: تعطيل ATSlet url = URL(string: "http://example.com/api/login")!let task = URLSession.shared.dataTask(with: url) { data, response, error in    // معالجة بيانات غير محمية}

الحل

قم بتكوين App Transport Security (ATS) في Info.plist واستخدم HTTPS. للتحقق من الشهادات، استخدم SSL pinning.

// طلب آمن مع SSL Pinning (مثال باستخدام Alamofire)let evaluator = PinnedCertificatesTrustEvaluator(certificates: [certificate])let session = Session(serverTrustManager: ServerTrustManager(evaluators: ["example.com": evaluator]))session.request("https://example.com/api/login").responseJSON { response in    // معالجة بيانات محمية}


4. الحقن عبر WebView (WebView Injection)

المشكلة

تحميل محتوى HTML مع بيانات المستخدم في WKWebView دون تعقيم (sanitization) يمكن أن يؤدي إلى هجمات XSS وسرقة ملفات تعريف الارتباط (cookies).

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

// كود ضعيفlet userComment = "<script>alert('XSS')</script>"let html                

المدونات

توصيات الكتب