Sicherheit von C#-Anwendungen: Top-10-Schwachstellen für Anfänger
\n\nDie Entwicklung sicherer Anwendungen in C# ist nicht nur ein Trend, sondern eine Notwendigkeit. Jeden Tag werden weltweit Tausende von Schwachstellen entdeckt, und Ihre Anwendung könnte das nächste Ziel sein. In diesem Artikel analysieren wir die 10 häufigsten Schwachstellen in C# (.NET)-Anwendungen, mit denen Anfänger konfrontiert werden. Sie erfahren, wie Sie diese erkennen und, was am wichtigsten ist, wie Sie Ihren Code schützen.
\n\n1. SQL-Injection
\n\nDie älteste und immer noch gefährlichste Schwachstelle. Sie tritt auf, wenn Benutzereingaben direkt in eine SQL-Abfrage eingefügt werden.
\n\nVerwundbarer Code:
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = '" + userName + "'";\nSqlCommand cmd = new SqlCommand(query, connection);\n\nSchutz: Verwenden Sie parametrisierte Abfragen oder Entity Framework.
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = @name";\nSqlCommand cmd = new SqlCommand(query, connection);\ncmd.Parameters.AddWithValue("@name", userName);\n\n2. Cross-Site Scripting (XSS)
\n\nXSS-Angriffe ermöglichen es einem Angreifer, ein bösartiges Skript auf einer Seite einzuschleusen, die anderen Benutzern angezeigt wird.
\n\nVerwundbarer Code:
\nstring comment = Request["comment"];\nResponse.Write("<div>" + comment + "</div>");\n\nSchutz: Codieren Sie die Ausgabe immer. Verwenden Sie HttpUtility.HtmlEncode():
string comment = Request["comment"];\nResponse.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");\n\n3. Fehlende Authentifizierung und Autorisierung
\n\nViele Anfänger vergessen, die Zugriffsrechte auf Ressourcen zu überprüfen. Beispielsweise kann ein Benutzer durch einfaches Ändern der ID in der URL auf das Profil eines anderen zugreifen.
\n\nVerwundbarer Code:
\npublic IActionResult Profile(int userId)\n{\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\nSchutz: Überprüfen Sie immer, ob der aktuelle Benutzer berechtigt ist, auf die angeforderte Ressource zuzugreifen:
\npublic IActionResult Profile(int userId)\n{\n var currentUserId = User.FindFirst(ClaimTypes.NameIdentifier).Value;\n if (userId != currentUserId) return Forbid();\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\n4. Datenleck durch Ausnahmen
\n\nEntwickler geben oft vollständige Fehlerinformationen aus, einschließlich des Aufrufstapels und von Verbindungszeichenfolgen.
\n\nVerwundbarer Code:
\ntry\n{\n // Code\n}\ncatch (Exception ex)\n{\n Response.Write(ex.ToString()); // GEFÄHRLICH!\n}\n\nSchutz: Verwenden Sie in der Produktion allgemeine Fehlermeldungen und protokollieren Sie Details an einem sicheren Ort:
\ntry\n{\n // Code\n}\ncatch (Exception ex)\n{\n _logger.LogError(ex, "Fehler bei der Verarbeitung der Anfrage");\n return StatusCode(500, "Es ist ein interner Serverfehler aufgetreten");\n}\n\n5. Unsichere Speicherung von Passwörtern
\n\nDie Speicherung von Passwörtern im Klartext oder mit schwachen Hash-Verfahren (MD5, SHA1) ist ein grober Fehler.
\n\nVerwundbarer Code:
\nstring passwordHash = MD5.Hash(password); // NICHT ERLAUBT!\n\nSchutz: Verwenden Sie moderne Hash-Algorithmen mit Salt, z. B. BCrypt oder ASP.NET Core Identity:
var passwordHasher = new PasswordHasher<IdentityUser>();\nstring passwordHash = passwordHasher.HashPassword(user, password);\n\n6. Unzureichender Schutz vor CSRF (Cross-Site Request Forgery)
\n\nEin Angriff, bei dem der Angreifer den Browser des Opfers dazu zwingt, eine unerwünschte Aktion auf einer anderen Website auszuführen, auf der