C# 应用程序安全:面向初学者的十大漏洞

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

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

开始课程

C# 应用程序安全:初学者必知的十大漏洞

软件安全是开发者的关键任务之一。即使是一个小型 C# 应用程序,如果未考虑常见漏洞,也可能成为攻击者的目标。在本文中,我们将介绍初学者开发人员遇到的 C# (.NET) 中最危险的 10 个漏洞。您将了解它们是如何产生的、如何被利用,以及最重要的是,如何防范它们。



1. SQL 注入

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

易受攻击的代码示例:

string userName = Request.QueryString["user"];string query = "SELECT * FROM Users WHERE Name = '" + userName + "'";SqlCommand cmd = new SqlCommand(query, connection);

攻击方式: 攻击者可以将值 ' OR 1=1 -- 传递给 user 参数,这将返回表中的所有记录。

防护措施: 使用参数化查询。

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


2. 跨站脚本攻击(XSS)

XSS 漏洞允许将恶意 JavaScript 代码注入到显示给其他用户的页面中。

易受攻击的代码示例(ASP.NET WebForms):

string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");

防护措施: 始终对输出进行编码。使用 HttpUtility.HtmlEncode() 或 Razor 语法(@),它们会自动对数据进行编码。

Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");


3. 不安全的反序列化

当对来自不可信源(例如请求或文件)的数据进行反序列化时,攻击者可以在服务器上执行任意代码。

易受攻击的代码示例(BinaryFormatter):

BinaryFormatter formatter = new BinaryFormatter();using (var stream = new MemoryStream(data)){    var obj = formatter.Deserialize(stream); // 危险!}

防护措施: 使用现代序列化器(JSON、带限制的 XML),验证类型,并且永远不要反序列化来自不可信客户端的数据。避免使用 BinaryFormatter、SoapFormatter 和 LosFormatter。



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

这包括弱密码、缺少登录尝试限制以及未受保护的会话 Cookie。

漏洞示例: 没有 HttpOnly 和 Secure 标志的会话 Cookie。

防护措施:

  • 使用 Identity 或 ASP.NET Core Identity。
  • 配置 Cookie:HttpOnly、Secure、SameSite=Strict。
  • 启用登录尝试限制(帐户锁定)。
  • 使用 HTTPS。
services.ConfigureApplicationCookie(options =>{    options.Cookie.HttpOnly = true;    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;    options.Cookie.SameSite = SameSiteMode.Strict;});


5. 跨站请求伪造(CSRF)

一种攻击,攻击者诱骗经过身份验证的用户在网站上执行非预期的操作(例如转账)。

防护措施: 使用防伪造令牌。在 ASP.NET Core 中,当使用带有 asp-antiforgery 的 <form> 标签时,会自动完成此操作。

博客

书籍推荐