C# 应用程序安全:十大常见漏洞实战解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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 或

博客

书籍推荐