Top-10-Schwachstellen von C#-Anwendungen und wie man sie vermeidet

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten
```html

Sicherheit von C#-Anwendungen: Die Top-10-Schwachstellen, die jeder Entwickler kennen sollte

Die Entwicklung mit C# und der .NET-Plattform ist ein leistungsstarkes Werkzeug zur Erstellung von Unternehmens- und Webanwendungen. Doch selbst der zuverlässigste Code kann Lücken enthalten, die zu Datenlecks, Reputationsverlust und finanziellen Einbußen führen. In diesem Artikel analysieren wir die 10 häufigsten Schwachstellen von C#-Anwendungen basierend auf dem OWASP Top 10, mit praktischen Beispielen und Schutzmaßnahmen.

1. SQL-Injection

Dies ist eine der ältesten, aber immer noch aktuellen Bedrohungen. Die Schwachstelle entsteht, wenn Benutzereingaben direkt in eine SQL-Abfrage konkateniert werden.

Verwundbarer Code:

string userName = Request.QueryString["name"];
string query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
SqlCommand cmd = new SqlCommand(query, connection);

Sicherer Code (parametrisierte Abfragen):

string userName = Request.QueryString["name"];
string query = "SELECT * FROM Users WHERE Name = @name";
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@name", userName);

Empfehlung: Verwenden Sie immer parametrisierte Abfragen oder Entity Framework, das Eingaben automatisch maskiert.

2. Cross-Site Scripting (XSS)

XSS-Angriffe ermöglichen es einem Angreifer, ein bösartiges Skript in eine Webseite einzuschleusen. In C# passiert dies häufig bei der Ausgabe ungeprüfter Daten über @Html.Raw().

Verwundbarer Code:

@Html.Raw(Model.Comment)

Sicherer Code (Ausgabekodierung):

@Html.Encode(Model.Comment)

Empfehlung: Verwenden Sie die Razor-Syntax @Model.Comment (sie kodiert HTML automatisch) und wenden Sie @Html.Raw() niemals ohne Prüfung an.

3. Cross-Site Request Forgery (CSRF)

CSRF zwingt einen authentifizierten Benutzer, eine unerwünschte Aktion auf der Website auszuführen (z. B. eine Geldüberweisung). In ASP.NET Core ist der Schutz integriert, muss aber korrekt aktiviert werden.

Verwundbarer Code (fehlendes Anti-Forgery-Token):

<form method="post" action="/Account/Delete">
    <button type="submit">Konto löschen</button>
</form>

Sicherer Code (mit AntiForgeryToken):

<form method="post" action="/Account/Delete">
    @Html.AntiForgeryToken()
    <button type="submit">Konto löschen</button>
</form>

Empfehlung: Fügen Sie Ihren POST-Methoden das Attribut [ValidateAntiForgeryToken] hinzu und verwenden Sie @Html.AntiForgeryToken() in Formularen.

4. Unsichere Speicherung von Passwörtern

Die Speicherung von Passwörtern im Klartext oder mit schwachen Hashes (MD5, SHA1) ist ein grober Fehler.

Verwundbarer Code:

string passwordHash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(password));

Sicherer Code (Verwendung von bcrypt/Argon2):

using BCrypt.Net;
string passwordHash = BCrypt.HashPassword(password, workFactor: 12);

Empfehlung: Verwenden Sie Bibliotheken wie BCrypt.Net oder Microsoft.AspNetCore.Identity, die automatisch Salt generieren und moderne Algorithmen einsetzen.

5. Offenlegung vertraulicher Daten in Ausnahmen

Die Ausgabe des vollständigen Fehlerstapels an den Benutzer kann die Anwendungsstruktur, Verbindungszeichenfolgen und Dateipfade preisgeben.

Verwundbarer Code (in production):

catch (Exception ex)
{
    return Content(ex.ToString());
}

Sicherer Code:

catch (Exception ex)
{
    _logger.LogError(ex, "Fehler bei der Verarbeitung der Anfrage");
    return StatusCode(500, "Interner Serverfehler");
}

Empfehlung: Protokollieren Sie Ausnahmen detailliert und geben Sie dem Benutzer nur allgemeine Fehlermeldungen zurück.

```

Blogs

Buchempfehlungen