أمان تطبيقات Swift: أهم 10 ثغرات وطرق الحماية
يتطلب التطوير باستخدام Swift لنظامي iOS و macOS اهتمامًا خاصًا بالأمان. حتى الخطأ البسيط قد يؤدي إلى تسرب البيانات أو الاختراق أو اختراق الجهاز. في هذه المقالة، سنستعرض أكثر 10 ثغرات شيوعًا في تطبيقات Swift، ونعرض أمثلة على الأكواد الخطرة، ونقدم توصيات عملية لإصلاحها.
1. تخزين البيانات غير الآمن (Insecure Data Storage)
الخطأ الأكثر شيوعًا هو حفظ البيانات الحساسة في UserDefaults أو ملفات Plist بدون تشفير.
الكود المشكل:
UserDefaults.standard.set("password123", forKey: "userPassword")UserDefaults.standard.synchronize()الحل الآمن: استخدم Keychain Services أو Data Protection API.
import Security
func savePassword(_ password: String, for account: String) { let data = password.data(using: .utf8)! let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: account, kSecValueData as String: data, kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly ] SecItemAdd(query as CFDictionary, nil)}2. عدم التحقق من صحة الإدخال (Input Validation)
غالبًا ما يحتوي إدخال المستخدم على بيانات ضارة. تحقق دائمًا من الإدخال وقم بتعقيمه.
مثال على حقن SQL:
let query = "SELECT * FROM users WHERE name = '\\(userInput)'" // خطير!الحماية: استخدم الاستعلامات ذات المعلمات.
let query = "SELECT * FROM users WHERE name = ?"let statement = try database.prepare(query)try statement.bind([userInput])3. الاتصال الشبكي غير الآمن (Insecure Network Communication)
استخدام HTTP بدلاً من HTTPS، وتجاهل شهادات SSL.
الكود الخطير:
let url = URL(string: "http://example.com/api")! // HTTP, وليس HTTPSlet task = URLSession.shared.dataTask(with: url) { data, response, error in // معالجة البيانات}النهج الآمن:
let url = URL(string: "https://example.com/api")!let config = URLSessionConfiguration.defaultconfig.tlsMinimumSupportedProtocolVersion = .TLSv12let session = URLSession(configuration: config)let task = session.dataTask(with: url) { data, response, error in guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { return } // معالجة البيانات}task.resume()4. حقن الكود عبر WebView (WebView Injection)
إذا كنت تستخدم WKWebView بدون قيود، يمكن للمهاجم تنفيذ كود JavaScript.
الكود القابل للاختراق:
webView.loadHTMLString(htmlContent, baseURL: nil)الحماية: قم بتعطيل JavaScript أو استخدم Content Security Policy.
let config = WKWebViewConfiguration()let preferences = WKPreferences()preferences.javaScriptEnabled = falseconfig.preferences = preferenceslet webView = WKWebView(frame: .zero, configuration: config)5. مفاتيح API والرموز المميزة غير المحمية (Hardcoded Secrets)
لا تقم أبدًا بتخزين مفاتيح API أو الرموز المميزة أو كلمات المرور في الكود المصدري.
غير صحيح:
let apiKey = "sk_live_1234567890abcdef"صحيح: استخدم ملفات .env، أو التفويض من الخادم، أو الخدمات السحابية (مثل AWS Secrets Manager).
// في Info.plist مفتاح مشفرif let apiKey = Bundle.main.object(forInfoDictionaryKey: "API_KEY") as? String { // نستخدم المفتاح}