Segurança de aplicações C#: top 10 vulnerabilidades para iniciantes
\n\nDesenvolver aplicações seguras em C# não é apenas uma tendência, mas uma necessidade. Todos os dias, milhares de vulnerabilidades são descobertas no mundo, e sua aplicação pode ser o próximo alvo. Neste artigo, vamos analisar as 10 vulnerabilidades mais comuns em aplicações C# (.NET) que desenvolvedores iniciantes enfrentam. Você aprenderá como detectá-las e, principalmente, como proteger seu código.
\n\n1. Injeção SQL (SQL Injection)
\n\nA vulnerabilidade mais antiga e ainda perigosa. Ela ocorre quando a entrada do usuário é inserida diretamente em uma consulta SQL.
\n\nCódigo vulnerável:
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = '" + userName + "'";\nSqlCommand cmd = new SqlCommand(query, connection);\n\nProteção: Use consultas parametrizadas 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. Cross-Site Scripting (XSS)
\n\nOs ataques XSS permitem que um invasor insira um script malicioso em uma página que é exibida para outros usuários.
\n\nCódigo vulnerável:
\nstring comment = Request["comment"];\nResponse.Write("<div>" + comment + "</div>");\n\nProteção: Sempre codifique a saída. Use HttpUtility.HtmlEncode():
string comment = Request["comment"];\nResponse.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");\n\n3. Falta de autenticação e autorização
\n\nMuitos iniciantes esquecem de verificar as permissões de acesso aos recursos. Por exemplo, um usuário pode acessar o perfil de outro simplesmente alterando o ID na URL.
\n\nCódigo vulnerável:
\npublic IActionResult Profile(int userId)\n{\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\nProteção: Sempre verifique se o usuário atual tem direito ao recurso solicitado:
\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. Vazamento de dados confidenciais por meio de exceções
\n\nDesenvolvedores frequentemente exibem informações completas sobre erros, incluindo a pilha de chamadas e strings de conexão.
\n\nCódigo vulnerável:
\ntry\n{\n // código\n}\ncatch (Exception ex)\n{\n Response.Write(ex.ToString()); // PERIGOSO!\n}\n\nProteção: Em produção, use mensagens de erro genéricas e registre os detalhes em um local seguro:
\ntry\n{\n // código\n}\ncatch (Exception ex)\n{\n _logger.LogError(ex, "Erro ao processar a requisição");\n return StatusCode(500, "Ocorreu um erro interno do servidor");\n}\n\n5. Armazenamento inseguro de senhas
\n\nArmazenar senhas em texto puro ou usando hashes fracos (MD5, SHA1) é um erro grave.
\n\nCódigo vulnerável:
\nstring passwordHash = MD5.Hash(password); // NÃO PODE!\n\nProteção: Use algoritmos modernos de hash com salt, como BCrypt ou ASP.NET Core Identity:
var passwordHasher = new PasswordHasher<IdentityUser>();\nstring passwordHash = passwordHasher.HashPassword(user, password);\n\n6. Proteção insuficiente contra CSRF (Cross-Site Request Forgery)
\n\nAtaque em que o invasor força o navegador da vítima a executar uma ação indesejada em outro site, onde