Sécurité des applications C# : top 10 des vulnérabilités et méthodes de protection dans .NET
Développer des applications sécurisées en C# et sur la plateforme .NET est une tâche cruciale pour tout développeur. Même avec les mécanismes de protection intégrés, le framework ne peut pas prévenir toutes les attaques. Dans cet article, nous analyserons les 10 vulnérabilités les plus courantes dans les applications C#, basées sur le classement actuel OWASP Top 10, et montrerons comment les éviter avec des exemples de code.
1. Injections SQL (SQL Injection)
L'une des vulnérabilités les plus anciennes et les plus dangereuses. Elle survient lorsque l'entrée utilisateur est directement concaténée dans une requête SQL.
Code vulnérable :
string query = "SELECT * FROM Users WHERE Username = '" + username + "'";SqlCommand cmd = new SqlCommand(query, connection);Code sécurisé (utilisation de requêtes paramétrées) :
string query = "SELECT * FROM Users WHERE Username = @username";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);2. Scripting intersite (XSS)
Attaque où un attaquant injecte un script malveillant dans une page web. Dans ASP.NET Core, il est important d'encoder la sortie.
Code vulnérable (Razor) :
<div>@Model.UserInput</div>Code sécurisé :
<div>@Html.Encode(Model.UserInput)</div>// Ou dans ASP.NET Core, utilisez @Model.UserInput si vous n'utilisez pas HtmlStringDans ASP.NET Core Razor, la sortie est encodée par défaut, mais l'utilisation de @Html.Raw() ou le retour d'un ContentResult avec des données non vérifiées ramène le risque.
3. Falsification de requête intersite (CSRF)
Attaque où un attaquant force un utilisateur authentifié à effectuer une action non désirée.
Protection dans ASP.NET Core :
// Dans ConfigureServicesservices.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");
// Dans le contrôleur[AutoValidateAntiforgeryToken]public class AccountController : Controller{ [HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangePassword(ChangePasswordModel model) { // code }}4. Désérialisation non sécurisée
Vulnérabilité dangereuse, surtout lors de l'utilisation de BinaryFormatter, SoapFormatter ou Newtonsoft.Json avec TypeNameHandling.All.
Code vulnérable :
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };var obj = JsonConvert.DeserializeObject(json, settings);Code sécurisé :
// Utilisez System.Text.Json (sécurisé par défaut)var obj = JsonSerializer.Deserialize<MyType>(json);// Ou limitez TypeNameHandling dans Newtonsoftvar settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None };5. Défauts d'authentification et de gestion des sessions
Inclut les mots de passe faibles, l'absence de verrouillage de compte, les cookies non sécurisés.
Recommandations :
- Utilisez ASP.NET Core Identity avec des politiques de mots de passe.
- Configurez la protection des cookies :
HttpOnly,Secure,SameSite. - Activez le verrouillage après N tentatives échouées.
services.ConfigureApplicationCookie(options =>{ options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Strict; options.ExpireTimeSpan = TimeSpan.FromMinutes(30); options.SlidingExpiration = true;});6. Divulgation de données sensibles
Stockage de mots de passe en clair, transmission de données via HTTP, journalisation de secrets.
Code sécurisé :
// Hachage des mots de passevar passwordHasher = new PasswordHasher<User>();string hash = passwordHa