Sécurité des applications C# : top 10 des vulnérabilités en pratique
La sécurité est l'un des aspects les plus importants du développement d'applications modernes en C# et .NET. Même un petit bug négligé peut entraîner une fuite de données ou une compromission totale du système. Dans cet article, nous allons passer en revue les 10 vulnérabilités les plus courantes rencontrées par les développeurs C# et montrer comment les éviter en pratique.
1. Injections SQL (SQL Injection)
La vulnérabilité la plus ancienne et la plus dangereuse. Elle survient lorsque l'entrée utilisateur est directement insérée dans une requête SQL.
Code vulnérable :
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = '" + login + "'";SqlCommand cmd = new SqlCommand(query, connection);Code sécurisé (requêtes paramétrées) :
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = @login";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@login", login);Protection supplémentaire : utilisez un ORM (Entity Framework) — il paramètre automatiquement les requêtes.
2. Scripting intersite (XSS)
Un attaquant injecte du code JavaScript malveillant dans une page via l'entrée utilisateur.
Code vulnérable :
string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");Code sécurisé (encodage de la sortie) :
string comment = Request.Form["comment"];Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");Dans ASP.NET Core, utilisez @Html.Encode() ou la syntaxe Razor avec encodage automatique.
3. Falsification de requête intersite (CSRF)
Attaque où l'attaquant force un utilisateur à effectuer une action non désirée sur un site où il est authentifié.
Code vulnérable (absence de protection) :
[HttpPost]public IActionResult DeleteAccount(int userId){ // Suppression du compte sans vérification de jeton return Ok();}Protection avec des jetons antifalsification dans ASP.NET Core :
[HttpPost][ValidateAntiForgeryToken]public IActionResult DeleteAccount(int userId){ // Suppression sécurisée return Ok();}Sur le client, le jeton est transmis via un champ de formulaire caché ou un en-tête.
4. Désérialisation non sécurisée
Lors de la désérialisation de données provenant d'une source non fiable, un attaquant peut exécuter du code arbitraire.
Code vulnérable (BinaryFormatter) :
BinaryFormatter formatter = new BinaryFormatter();using (FileStream fs = new FileStream("data.bin", FileMode.Open)){ var obj = formatter.Deserialize(fs); // Dangereux !}Alternatives sécurisées :
- Utilisez
System.Text.JsonouNewtonsoft.Jsonavec restriction des types. - Activez
TypeNameHandling.None. - Évitez
BinaryFormatter,SoapFormatteretLosFormatter.
5. Faiblesses d'authentification et de gestion des sessions
Authentification faible, stockage des mots de passe en clair, jetons de session prévisibles.
Erreurs :
- Stockage du mot de passe en clair :
User.Password = txtPassword.Text; - Implémentation personnalisée du hachage sans sel.
- Utilisation de
Guid.NewGuid()pour générer des jetons — trop prévisible.
Approche correcte :
- Utilisez
ASP.NET Core Identity— une solution intégrée. - Hachez les mots de passe avec
BCrypt.Netou