Sicherheit von Swift-Anwendungen: Top-10 Schwachstellen für Anfänger
\n\nDie Entwicklung mit Swift für iOS und macOS erfordert besondere Aufmerksamkeit für die Sicherheit. Selbst kleine Fehler können zu Datenlecks oder einem Hack der Anwendung führen. In diesem Artikel analysieren wir die 10 häufigsten Schwachstellen, auf die Anfänger-Entwickler stoßen, und zeigen, wie man sie vermeidet.
\n\n1. Unsichere Datenspeicherung in UserDefaults
\nViele Anfänger speichern vertrauliche Daten (Passwörter, Token) in UserDefaults. Dies ist ein gemeinsamer Bereich, die Daten werden im Klartext gespeichert.
// ❌ Gefährlich\nUserDefaults.standard.set("secret_password", forKey: "userPass")\n\n// ✅ Sicher – Keychain verwenden\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. SQL-Injection in Core Data
\nDie Verwendung von String-Prädikaten mit Benutzereingaben önet den Weg für SQL-Injection.
\n// ❌ Anfällig\nlet input = "admin' OR '1'='1"\nlet predicate = NSPredicate(format: "name == %@", input)\n\n// ✅ Sicher – parametrisierte Abfragen verwenden\nlet safePredicate = NSPredicate(format: "name == %@", input)\n\n\n3. Fehlende Eingabevalidierung
\nVertrauen in Benutzereingaben ist einer der Hauptfehler. Ein Angreifer kann schädliche Daten über Textfelder senden.
\nfunc processUserInput(_ text: String) {\n // ❌ Jede Eingabe durchlassen\n let url = URL(string: "https://api.example.com/search?q=\\(text)")\n \n // ✅ Prüfen und escapen\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. Unsichere Netzwerkverbindung (HTTP statt HTTPS)
\nDie Verwendung von HTTP macht Daten anfällig für Abfangen. Verwenden Sie immer HTTPS.
\n// ❌ Gefährlich\nlet config = URLSessionConfiguration.default\nconfig.waitsForConnectivity = false\n\n// ✅ Sicher – HTTPS erzwingen\nlet config = URLSessionConfiguration.default\nconfig.connectionProxyDictionary?.removeAll()\nconfig.tlsMinimumSupportedProtocolVersion = .TLSv12\n\n\n5. Datenleck durch Logs
\nEntwickler lassen oft print() mit vertraulichen Daten im Production-Build.
// ❌ Gefährlich\nprint("User token: \\(token)")\n\n// ✅ Sicher – bedingte Kompilierung verwenden\n#if DEBUG\nprint("Debug: token length = \\(token.count)")\n#endif\n\n\n6. Falsches Speichermanagement (Retain Cycles)
\nSpeicherlecks können zu DoS-Angriffen führen. Verwenden Sie schwache Referenzen in Closures.
\n// ❌ Speicherleck\nclass ViewController: UIViewController {\n var handler: (() -> Void)?\n override func viewDidLoad() {\n handler = {\n self.view.backgroundColor = .red // Starke Referenz\n }\n }\n}\n\n// ✅ Sicher – schwache Referenz\nhandler = { [weak self] in\n self?.view.backgroundColor = .red\n}\n\n\n7. Fehlende Authentifizierung von URL-Schemata
\nBetrügerische Anwendungen können die URL-Schemata Ihrer Anwendung abfangen.
\n// ❌ Anfällig\nfunc application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {\n // Jede URL verarbeiten\n return true\n}\n\n// ✅ Sicher – Quelle prüfen\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 // URL-Verarbeitung\n return true\n}\n\n\nBlogs
Buchempfehlungen
Lesen Sie auch
CI/CD für C++-Projekte: Einrichtung von GitHub Actions