Sicherheit von C#-Anwendungen: Die Top-10-Schwachstellen in der Praxis
Sicherheit ist eine der wichtigsten Komponenten bei der Entwicklung moderner Anwendungen mit C# und .NET. Selbst ein kleiner übersehener Fehler kann zu Datenlecks oder einer vollständigen Kompromittierung des Systems führen. In diesem Artikel analysieren wir die 10 häufigsten Schwachstellen, auf die C#-Entwickler stoßen, und zeigen, wie Sie diese in der Praxis vermeiden können.
1. SQL-Injection
Die älteste und gefährlichste Schwachstelle. Sie tritt auf, wenn Benutzereingaben direkt in eine SQL-Abfrage eingefügt werden.
Anfälliger Code:
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = '" + login + "'";SqlCommand cmd = new SqlCommand(query, connection);Sicherer Code (parametrisierte Abfragen):
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = @login";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@login", login);Zusätzlicher Schutz: Verwenden Sie ein ORM (Entity Framework) – es parametrisiert Abfragen automatisch.
2. Cross-Site-Scripting (XSS)
Ein Angreifer schleust schädlichen JavaScript-Code über Benutzereingaben in eine Seite ein.
Anfälliger Code:
string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");Sicherer Code (Ausgabekodierung):
string comment = Request.Form["comment"];Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");Verwenden Sie in ASP.NET Core @Html.Encode() oder die Razor-Syntax mit automatischer Kodierung.
3. Cross-Site-Request-Forgery (CSRF)
Ein Angriff, bei dem ein Angreifer einen Benutzer dazu zwingt, eine unerwünschte Aktion auf einer Website auszuführen, bei der er angemeldet ist.
Anfälliger Code (fehlender Schutz):
[HttpPost]public IActionResult DeleteAccount(int userId){ // Konto löschen ohne Token-Überprüfung return Ok();}Schutz mit Anti-Forgery-Tokens in ASP.NET Core:
[HttpPost][ValidateAntiForgeryToken]public IActionResult DeleteAccount(int userId){ // Sicheres Löschen return Ok();}Auf der Clientseite wird das Token über ein verstecktes Formularfeld oder einen Header übertragen.
4. Unsichere Deserialisierung
Bei der Deserialisierung von Daten aus einer nicht vertrauenswürdigen Quelle kann ein Angreifer beliebigen Code ausführen.
Anfälliger Code (BinaryFormatter):
BinaryFormatter formatter = new BinaryFormatter();using (FileStream fs = new FileStream("data.bin", FileMode.Open)){ var obj = formatter.Deserialize(fs); // Gefährlich!}Sichere Alternativen:
- Verwenden Sie
System.Text.JsonoderNewtonsoft.Jsonmit Typeneinschränkung. - Aktivieren Sie
TypeNameHandling.None. - Vermeiden Sie
BinaryFormatter,SoapFormatterundLosFormatter.
5. Mängel bei Authentifizierung und Sitzungsverwaltung
Schwache Authentifizierung, Speicherung von Passwörtern im Klartext, vorhersagbare Sitzungstoken.
Fehler:
- Speicherung des Passworts im Klartext:
User.Password = txtPassword.Text; - Eigene Implementierung von Hashing ohne Salt.
- Verwendung von
Guid.NewGuid()zur Generierung von Token – zu vorhersagbar.
Richtiger Ansatz:
- Verwenden Sie
ASP.NET Core Identity– eine integrierte Lösung. - Hashen Sie Passwörter mit
BCrypt.Netoder