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, "内部服务器错误");}建议