C# 应用程序安全:初学者必知的十大漏洞
\n\n开发安全的 C# 应用程序不仅是一种趋势,更是一种必要。每天世界上都会发现成千上万的漏洞,您的应用程序可能成为下一个目标。在本文中,我们将分析初学者在 C# (.NET) 应用程序中遇到的 10 个最常见漏洞。您将学习如何发现它们,更重要的是,如何保护您的代码。
\n\n1. SQL 注入 (SQL Injection)
\n\n这是最古老且至今仍然危险的漏洞。当用户输入直接拼接到 SQL 查询中时,就会产生这种漏洞。
\n\n有漏洞的代码:
\nstring userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = '" + userName + "'";\nSqlCommand cmd = new SqlCommand(query, connection);\n\n防护措施: 使用参数化查询或 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. 跨站脚本攻击 (XSS)
\n\nXSS 攻击允许攻击者将恶意脚本注入到显示给其他用户的页面中。
\n\n有漏洞的代码:
\nstring comment = Request["comment"];\nResponse.Write("<div>" + comment + "</div>");\n\n防护措施: 始终对输出进行编码。使用 HttpUtility.HtmlEncode():
string comment = Request["comment"];\nResponse.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");\n\n3. 缺乏身份验证和授权
\n\n许多新手忘记检查对资源的访问权限。例如,用户只需更改 URL 中的 ID 即可访问他人的个人资料。
\n\n有漏洞的代码:
\npublic IActionResult Profile(int userId)\n{\n var user = _context.Users.Find(userId);\n return View(user);\n}\n\n防护措施: 始终检查当前用户是否有权访问所请求的资源:
\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. 通过异常泄露敏感数据
\n\n开发者经常输出完整的错误信息,包括调用堆栈和连接字符串。
\n\n有漏洞的代码:
\ntry\n{\n // 代码\n}\ncatch (Exception ex)\n{\n Response.Write(ex.ToString()); // 危险!\n}\n\n防护措施: 在生产环境中使用通用错误消息,并将详细信息记录到安全位置:
\ntry\n{\n // 代码\n}\ncatch (Exception ex)\n{\n _logger.LogError(ex, "处理请求时出错");\n return StatusCode(500, "服务器内部错误");\n}\n\n5. 不安全的密码存储
\n\n以明文形式或使用弱哈希算法(MD5、SHA1)存储密码是严重的错误。
\n\n有漏洞的代码:
\nstring passwordHash = MD5.Hash(password); // 禁止!\n\n防护措施: 使用带盐的现代哈希算法,例如 BCrypt 或 ASP.NET Core Identity:
var passwordHasher = new PasswordHasher<IdentityUser>();\nstring passwordHash = passwordHasher.HashPassword(user, password);\n\n6. 对 CSRF(跨站请求伪造)防护不足
\n\n一种攻击方式,攻击者诱使受害者的浏览器在另一个网站上执行非预期的操作,而该网站