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> 标签时,会自动完成此操作。