Sécurité des applications C# : top 10 des vulnérabilités pour débutants
\n\nDévelopper des applications sécurisées en C# n'est pas seulement une tendance, mais une nécessité. Chaque jour, des milliers de vulnérabilités sont découvertes dans le monde, et votre application pourrait devenir la prochaine cible. Dans cet article, nous allons analyser les 10 vulnérabilités les plus courantes dans les applications C# (.NET) rencontrées par les développeurs débutants. Vous apprendrez à les détecter et, surtout, à protéger votre code.
\n\n1. Injections SQL (SQL Injection)
\n\nLa vulnérabilité la plus ancienne et toujours dangereuse. Elle survient lorsque l'entrée utilisateur est directement insérée dans une requête SQL.
\n\nCode vulnérable :
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = '" + userName + "'";\nSqlCommand cmd = new SqlCommand(query, connection);\n\nProtection : Utilisez des requêtes paramétrées ou 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. Scripting inter-sites (XSS)
\n\nLes attaques XSS permettent à un attaquant d'injecter un script malveillant sur une page affichée à d'autres utilisateurs.
\n\nCode vulnérable :
\nstring comment = Request["comment"];\nResponse.Write("<div>" + comment + "</div>");\n\nProtection : Encodez toujours la sortie. Utilisez HttpUtility.HtmlEncode() :
string comment = Request["comment"];\nResponse.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");\n\n3. Absence d'authentification et d'autorisation
\n\nDe nombreux débutants oublient de vérifier les droits d'accès aux ressources. Par exemple, un utilisateur peut accéder au profil d'un autre en modifiant simplement l'ID dans l'URL.
\n\nCode vulnérable :
\npublic IActionResult Profile(int userId)\n{\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\nProtection : Vérifiez toujours que l'utilisateur actuel a le droit d'accéder à la ressource demandée :
\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. Fuite de données confidentielles via les exceptions
\n\nLes développeurs affichent souvent des informations d'erreur complètes, y compris la pile d'appels et les chaînes de connexion.
\n\nCode vulnérable :
\ntry\n{\n // code\n}\ncatch (Exception ex)\n{\n Response.Write(ex.ToString()); // DANGEREUX !\n}\n\nProtection : En production, utilisez des messages d'erreur génériques et enregistrez les détails dans un endroit sécurisé :
\ntry\n{\n // code\n}\ncatch (Exception ex)\n{\n _logger.LogError(ex, "Erreur lors du traitement de la requête");\n return StatusCode(500, "Une erreur interne du serveur s'est produite");\n}\n\n5. Stockage non sécurisé des mots de passe
\n\nStocker les mots de passe en clair ou avec des hachages faibles (MD5, SHA1) est une erreur grave.
\n\nCode vulnérable :
\nstring passwordHash = MD5.Hash(password); // INTERDIT !\n\nProtection : Utilisez des algorithmes de hachage modernes avec sel, par exemple BCrypt ou ASP.NET Core Identity :
var passwordHasher = new PasswordHasher<IdentityUser>();\nstring passwordHash = passwordHasher.HashPassword(user, password);\n\n6. Protection insuffisante contre CSRF (Cross-Site Request Forgery)
\n\nAttaque où un attaquant force le navigateur de la victime à effectuer une action non désirée sur un autre site, où