C# 应用程序安全:十大漏洞与 .NET 防护

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

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

开始课程

C# 应用程序安全:.NET 中十大漏洞及防护方法



在 C# 和 .NET 平台上开发安全应用程序是每位开发者至关重要的任务。即使框架内置了保护机制,也无法防范所有攻击。在本文中,我们将根据最新的 OWASP Top 10 排名,分析 C# 应用程序中最常见的 10 个漏洞,并通过代码示例展示如何避免它们。



1. SQL 注入

这是最古老且最危险的漏洞之一。当用户输入直接拼接到 SQL 查询中时,就会发生这种漏洞。

存在漏洞的代码:

string query = "SELECT * FROM Users WHERE Username = '" + username + "'";SqlCommand cmd = new SqlCommand(query, connection);

安全代码(使用参数化查询):

string query = "SELECT * FROM Users WHERE Username = @username";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);


2. 跨站脚本攻击 (XSS)

攻击者将恶意脚本注入网页的攻击方式。在 ASP.NET Core 中,对输出进行编码非常重要。

存在漏洞的代码(Razor):

<div>@Model.UserInput</div>

安全代码:

<div>@Html.Encode(Model.UserInput)</div>// 在 ASP.NET Core 中,如果不使用 HtmlString,默认使用 @Model.UserInput

在 ASP.NET Core Razor 中,默认会对输出进行编码,但使用 @Html.Raw() 或返回未验证数据的 ContentResult 时,风险会再次出现。



3. 跨站请求伪造 (CSRF)

攻击者强迫已通过身份验证的用户执行非预期操作的攻击方式。

ASP.NET Core 中的防护:

// 在 ConfigureServices 中services.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");

// 在控制器中[AutoValidateAntiforgeryToken]public class AccountController : Controller{ [HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangePassword(ChangePasswordModel model) { // 代码 }}


4. 不安全的反序列化

一种危险的漏洞,尤其在使用 BinaryFormatter、SoapFormatter 或带有 TypeNameHandling.All 的 Newtonsoft.Json 时。

存在漏洞的代码:

var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };var obj = JsonConvert.DeserializeObject(json, settings);

安全代码:

// 使用 System.Text.Json(默认安全)var obj = JsonSerializer.Deserialize<MyType>(json);// 或者在 Newtonsoft 中限制 TypeNameHandlingvar settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None };


5. 身份验证和会话管理缺陷

包括弱密码、缺少账户锁定、未受保护的 Cookie。

建议:

  • 使用带有密码策略的 ASP.NET Core Identity。
  • 配置 Cookie 保护:HttpOnly、Secure、SameSite。
  • 在 N 次登录失败后启用锁定。
services.ConfigureApplicationCookie(options =>{    options.Cookie.HttpOnly = true;    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;    options.Cookie.SameSite = SameSiteMode.Strict;    options.ExpireTimeSpan = TimeSpan.FromMinutes(30);    options.SlidingExpiration = true;});


6. 敏感数据泄露

以纯文本形式存储密码、通过 HTTP 传输数据、记录机密信息。

安全代码:

// 密码哈希var passwordHasher = new PasswordHasher<User>();string hash = passwordHa                

博客

书籍推荐