Sécurité des applications Swift : top 10 des vulnérabilités pour débutants
\n\nLe développement en Swift pour iOS et macOS nécessite une attention particulière à la sécurité. Même de petites erreurs peuvent entraîner une fuite de données ou le piratage de l'application. Dans cet article, nous allons analyser les 10 vulnérabilités les plus courantes rencontrées par les développeurs débutants et montrer comment les éviter.
\n\n1. Stockage non sécurisé des données dans UserDefaults
\nDe nombreux débutants sauvegardent des données confidentielles (mots de passe, jetons) dans UserDefaults. C'est une zone partagée, les données sont stockées en clair.
// ❌ Dangereux\nUserDefaults.standard.set("secret_password", forKey: "userPass")\n\n// ✅ Sécurisé — utiliser Keychain\nimport Security\nlet query: [String: Any] = [\n kSecClass as String: kSecClassGenericPassword,\n kSecAttrAccount as String: "userPass",\n kSecValueData as String: "secret_password".data(using: .utf8)!\n]\nSecItemAdd(query as CFDictionary, nil)\n\n\n2. Injections SQL dans Core Data
\nL'utilisation de prédicats sous forme de chaînes avec des entrées utilisateur ouvre la voie aux injections SQL.
\n// ❌ Vulnérable\nlet input = "admin' OR '1'='1"\nlet predicate = NSPredicate(format: "name == %@", input)\n\n// ✅ Sécurisé — utiliser des requêtes paramétrées\nlet safePredicate = NSPredicate(format: "name == %@", input)\n\n\n3. Absence de validation des entrées
\nFaire confiance aux entrées utilisateur est l'une des principales erreurs. Un attaquant peut envoyer des données malveillantes via des champs de texte.
\nfunc processUserInput(_ text: String) {\n // ❌ On laisse passer toute entrée\n let url = URL(string: "https://api.example.com/search?q=\\(text)")\n \n // ✅ On vérifie et on échappe\n guard let encoded = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return }\n let safeUrl = URL(string: "https://api.example.com/search?q=\\(encoded)")\n}\n\n\n4. Connexion réseau non sécurisée (HTTP au lieu de HTTPS)
\nL'utilisation de HTTP rend les données vulnérables à l'interception. Utilisez toujours HTTPS.
\n// ❌ Dangereux\nlet config = URLSessionConfiguration.default\nconfig.waitsForConnectivity = false\n\n// ✅ Sécurisé — forcer HTTPS\nlet config = URLSessionConfiguration.default\nconfig.connectionProxyDictionary?.removeAll()\nconfig.tlsMinimumSupportedProtocolVersion = .TLSv12\n\n\n5. Fuite de données via les logs
\nLes développeurs laissent souvent des print() avec des données confidentielles dans la version de production.
// ❌ Dangereux\nprint("User token: \\(token)")\n\n// ✅ Sécurisé — utiliser la compilation conditionnelle\n#if DEBUG\nprint("Debug: token length = \\(token.count)")\n#endif\n\n\n6. Gestion incorrecte de la mémoire (Cycles de rétention)
\nLes fuites mémoire peuvent entraîner des attaques DoS. Utilisez des références faibles dans les closures.
\n// ❌ Fuite mémoire\nclass ViewController: UIViewController {\n var handler: (() -> Void)?\n override func viewDidLoad() {\n handler = {\n self.view.backgroundColor = .red // Référence forte\n }\n }\n}\n\n// ✅ Sécurisé — référence faible\nhandler = { [weak self] in\n self?.view.backgroundColor = .red\n}\n\n\n7. Absence de vérification d'authenticité des schémas d'URL
\nDes applications frauduleuses peuvent intercepter les schémas d'URL de votre application.
\n// ❌ Vulnérable\nfunc application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {\n // Traiter toute URL\n return true\n}\n\n// ✅ Sécurisé — vérifier la source\nfunc application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {\n guard let sourceApp = options[.sourceApplication] as? String,\n sourceApp == "com.trusted.app" else {\n return false\n }\n // Traitement de l'URL\n return true\n}\n\n\nBlogs
Book Recommendations
Lire aussi
WebSocket en Go : création d'applications temps réel de zéro
Maintenir ses compétences Python : guide pratique 2025