C# 应用程序十大漏洞及如何避免

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

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

开始课程

C#应用程序安全:每位开发者应知的十大漏洞



使用C#和.NET平台开发是创建企业级和Web应用程序的强大工具。然而,即使是最可靠的代码也可能存在漏洞,导致数据泄露、声誉损失和经济损失。在本文中,我们将基于OWASP Top 10,通过实际示例和保护方法,分析C#应用程序中最常见的10种漏洞。



1. SQL注入



这是最古老但仍然相关的威胁之一。当用户输入直接拼接到SQL查询中时,就会产生漏洞。



存在漏洞的代码:

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


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

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


建议:始终使用参数化查询或Entity Framework,它们会自动转义输入。



2. 跨站脚本攻击(XSS)



XSS攻击允许攻击者将恶意脚本注入网页。在C#中,这通常发生在通过@Html.Raw()输出未检查的数据时。



存在漏洞的代码:

@Html.Raw(Model.Comment)


安全代码(输出编码):

@Html.Encode(Model.Comment)


建议:使用Razor语法@Model.Comment(它会自动编码HTML),并且未经验证绝不使用@Html.Raw()。



3. 跨站请求伪造(CSRF)



CSRF强制已认证用户在网站上执行非预期操作(例如转账)。在ASP.NET Core中,保护功能是内置的,但需要正确启用。



存在漏洞的代码(缺少防伪造令牌):

<form method="post" action="/Account/Delete">    <button type="submit">删除账户</button></form>


安全代码(使用AntiForgeryToken):

<form method="post" action="/Account/Delete">    @Html.AntiForgeryToken()    <button type="submit">删除账户</button></form>


建议:在POST方法中添加[ValidateAntiForgeryToken]特性,并在表单中使用@Html.AntiForgeryToken()。



4. 不安全的密码存储



以明文存储密码或使用弱哈希(MD5、SHA1)是一个严重错误。



存在漏洞的代码:

string passwordHash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(password));


安全代码(使用bcrypt/Argon2):

using BCrypt.Net;string passwordHash = BCrypt.HashPassword(password, workFactor: 12);


建议:使用BCrypt.Net或Microsoft.AspNetCore.Identity库,它们会自动生成盐值并使用现代算法。



5. 异常中暴露敏感数据



向用户显示完整的错误堆栈可能会泄露应用程序结构、连接字符串和文件路径。



存在漏洞的代码(生产环境中):

catch (Exception ex){    return Content(ex.ToString());}


安全代码:

catch (Exception ex){    _logger.LogError(ex, "处理请求时出错");    return StatusCode(500, "内部服务器错误");}


建议

博客

书籍推荐