Sécurité des applications Swift : top 10 des vulnérabilités pour débutants

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 pour débutants

\n\n

Le 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\n

1. Stockage non sécurisé des données dans UserDefaults

\n

De 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.

\n
// ❌ 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\n

2. Injections SQL dans Core Data

\n

L'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\n

3. Absence de validation des entrées

\n

Faire confiance aux entrées utilisateur est l'une des principales erreurs. Un attaquant peut envoyer des données malveillantes via des champs de texte.

\n
func 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\n

4. Connexion réseau non sécurisée (HTTP au lieu de HTTPS)

\n

L'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\n

5. Fuite de données via les logs

\n

Les développeurs laissent souvent des print() avec des données confidentielles dans la version de production.

\n
// ❌ 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\n

6. Gestion incorrecte de la mémoire (Cycles de rétention)

\n

Les 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\n

7. Absence de vérification d'authenticité des schémas d'URL

\n

Des 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\n

Blogs

Book Recommendations