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

Le développement d'applications mobiles et de bureau en Swift nécessite non seulement la connaissance de la syntaxe et des frameworks, mais aussi une compréhension des bases de la cybersécurité. Même une petite erreur dans le code peut entraîner une fuite de données utilisateur ou une compromission de l'appareil. Dans cet article, nous analyserons le top 10 des vulnérabilités courantes des applications Swift rencontrées par les développeurs débutants, et montrerons comment les éviter.



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

L'une des erreurs les plus fréquentes est la sauvegarde d'informations confidentielles (mots de passe, jetons, clés API) dans UserDefaults ou dans des fichiers texte ordinaires. Ces données sont facilement extractibles sur un appareil jailbreaké.

// Incorrect : stockage du mot de passe dans UserDefaultsUserDefaults.standard.set("mySecretPassword", forKey: "userPassword")

// Correct : utilisation de Keychainimport Securitylet password = "mySecretPassword"let keychainItem = [ kSecClass: kSecClassGenericPassword, kSecAttrAccount: "userPassword", kSecValueData: password.data(using: .utf8)!] as CFDictionarySecItemAdd(keychainItem, nil)


2. Injections via SQLite et Core Data

L'utilisation de chaînes brutes dans les requêtes de base de données ouvre la voie aux injections SQL. Même si vous utilisez Core Data, des prédicats non sécurisés peuvent être attaqués.

// Incorrect : substitution directelet username = "admin' OR '1'='1"let query = "SELECT * FROM users WHERE name = '\\(username)'"

// Correct : utilisation de requêtes paramétrées (FMDB)let query = "SELECT * FROM users WHERE name = ?"db.executeQuery(query, withArgumentsIn: [username])


3. Absence de HTTPS et SSL Pinning

L'utilisation de HTTP au lieu de HTTPS rend l'application vulnérable aux attaques "homme du milieu" (MITM). Même avec HTTPS, il est recommandé d'utiliser SSL Pinning pour une protection supplémentaire.

// Configuration HTTPS dans Info.plist// <key>NSAppTransportSecurity</key>// <dict>//     <key>NSAllowsArbitraryLoads</key>//     <false/>// </dict>

// Implémentation de SSL Pinning avec URLSessionlet pinnedKeys = ["yourPublicKeyHash"]let delegate = URLSessionPinningDelegate(pinnedKeys: pinnedKeys)let session = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil)


4. Algorithmes de chiffrement faibles

L'utilisation d'algorithmes de chiffrement obsolètes (MD5, SHA1) ou de fonctions cryptographiques maison rend les données vulnérables. Utilisez toujours des bibliothèques modernes.

// Incorrect : MD5let hash = MD5(string: "password")

// Correct : utilisation de CommonCrypto avec SHA256import CommonCryptofunc sha256(_ data: Data) -> Data { var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)) data.withUnsafeBytes { _ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &hash) } return Data(hash)}


5. Validation insuffisante des entrées (Input Validation)

L'absence de validation des entrées utilisateur peut entraîner des attaques XSS (dans WebView) ou une corruption des données. Vérifiez toutes les données d'entrée pour la longueur, le format et le contenu.

// Incorrect : confiance dans l'entréelet userInput = textField.textwebView.loadHTMLString(userInput!, baseURL: nil)

// Correct : assainissement de l'entréefunc sanitizeInput(_ input: String) -> String { return input .replacingOccurrences(of: "&", with: "&") .replacingOccurrences(of: "<", with: "<") .replacingOccurrences(of: ">", with: ">")}


6. Fuite de données via les logs et le débogage

Les print() ou NSLog laissés en production peuvent divulguer des données confidentielles. Utilisez la compilation conditionnelle pour les messages de débogage.

// Incorrect : journalisation en prod                

Blogs

Book Recommendations