Sécurité des applications Swift : top 10 des vulnérabilités et méthodes de protection

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sécurité des applications Swift : top 10 des vulnérabilités et méthodes de protection



Le développement en Swift pour iOS et macOS nécessite une attention particulière à la sécurité. Même une petite erreur peut entraîner une fuite de données, un piratage ou une compromission de l'appareil. Dans cet article, nous allons passer en revue les 10 vulnérabilités les plus courantes dans les applications Swift, montrer des exemples de code dangereux et donner des recommandations pratiques pour les corriger.



1. Stockage non sécurisé des données (Insecure Data Storage)

L'erreur la plus fréquente est la sauvegarde de données confidentielles dans UserDefaults ou des fichiers Plist sans chiffrement.



Code problématique :

UserDefaults.standard.set("password123", forKey: "userPassword")UserDefaults.standard.synchronize()


Solution sécurisée : Utilisez Keychain Services ou 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. Absence de validation des entrées (Input Validation)

Les entrées utilisateur contiennent souvent des données malveillantes. Vérifiez et assainissez toujours les entrées.



Exemple d'injection SQL :

let query = "SELECT * FROM users WHERE name = '\\(userInput)'" // Dangereux !


Protection : Utilisez des requêtes paramétrées.

let query = "SELECT * FROM users WHERE name = ?"let statement = try database.prepare(query)try statement.bind([userInput])


3. Communication réseau non sécurisée (Insecure Network Communication)

Utilisation de HTTP au lieu de HTTPS, ignorance des certificats SSL.



Code dangereux :

let url = URL(string: "http://example.com/api")! // HTTP, pas HTTPSlet task = URLSession.shared.dataTask(with: url) { data, response, error in    // Traitement des données}


Approche sécurisée :

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    }    // Traitement des données}task.resume()


4. Injection de code via WebView (WebView Injection)

Si vous utilisez WKWebView sans restrictions, un attaquant peut exécuter du code JavaScript.



Code vulnérable :

webView.loadHTMLString(htmlContent, baseURL: nil)


Protection : Désactivez JavaScript ou utilisez une Content Security Policy.

let config = WKWebViewConfiguration()let preferences = WKPreferences()preferences.javaScriptEnabled = falseconfig.preferences = preferenceslet webView = WKWebView(frame: .zero, configuration: config)


5. Clés API et jetons non protégés (Hardcoded Secrets)

Ne stockez jamais les clés API, jetons ou mots de passe dans le code source.



Incorrect :

let apiKey = "sk_live_1234567890abcdef"


Correct : Utilisez des fichiers .env, une autorisation serveur ou des services cloud (par exemple, AWS Secrets Manager).



// Dans Info.plist, clé chiffréeif let apiKey = Bundle.main.object(forInfoDictionaryKey: "API_KEY") as? String {    // Utilisation de la clé}


6. Protection insuffisante contre le reverse

Blogs

Book Recommendations