C# 应用程序安全:十大常见漏洞实战解析
安全是现代 C# 和 .NET 应用程序开发中最重要的组成部分之一。即使是一个被忽略的小错误,也可能导致数据泄露或系统完全被攻破。在本文中,我们将剖析开发者最常遇到的 10 种常见漏洞,并展示如何在实践中避免它们。
1. SQL 注入 (SQL Injection)
这是最古老且最危险的漏洞。当用户输入被直接拼接到 SQL 查询中时就会发生。
有漏洞的代码:
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = '" + login + "'";SqlCommand cmd = new SqlCommand(query, connection);安全的代码(参数化查询):
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = @login";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@login", login);额外防护: 使用 ORM(如 Entity Framework)——它会自动参数化查询。
2. 跨站脚本攻击 (XSS)
攻击者通过用户输入将恶意 JavaScript 代码注入到页面中。
有漏洞的代码:
string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");安全的代码(输出编码):
string comment = Request.Form["comment"];Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");在 ASP.NET Core 中,使用 @Html.Encode() 或具有自动编码功能的 Razor 语法。
3. 跨站请求伪造 (CSRF)
一种攻击,攻击者诱使用户在其已登录的网站上执行非预期的操作。
有漏洞的代码(缺少防护):
[HttpPost]public IActionResult DeleteAccount(int userId){ // 删除账户,未验证令牌 return Ok();}在 ASP.NET Core 中使用防伪令牌进行防护:
[HttpPost][ValidateAntiForgeryToken]public IActionResult DeleteAccount(int userId){ // 安全删除 return Ok();}在客户端,令牌通过隐藏表单字段或标头传递。
4. 不安全的反序列化
当从不可信来源反序列化数据时,攻击者可以执行任意代码。
有漏洞的代码(BinaryFormatter):
BinaryFormatter formatter = new BinaryFormatter();using (FileStream fs = new FileStream("data.bin", FileMode.Open)){ var obj = formatter.Deserialize(fs); // 危险!}安全的替代方案:
- 使用
System.Text.Json或Newtonsoft.Json并限制类型。 - 启用
TypeNameHandling.None。 - 避免使用
BinaryFormatter、SoapFormatter和LosFormatter。
5. 身份验证和会话管理缺陷
弱身份验证、明文存储密码、可预测的会话令牌。
错误做法:
- 明文存储密码:
User.Password = txtPassword.Text; - 自行实现无盐哈希。
- 使用
Guid.NewGuid()生成令牌——过于可预测。
正确方法:
- 使用
ASP.NET Core Identity——内置解决方案。 - 使用
BCrypt.Net或