零点博客复盘:用C#开发在线SQL调试器,彻底吃透MySQL注入防护与预处理实战
大家好,我是零点博客的老博主。最近在整理旧项目代码时,突发奇想想把常用的 MySQL SQL语句 调试功能封装成一个轻量级的在线工具。但在开发过程中,尤其是处理参数化查询和防注入这块,踩了不少坑,也复盘了不少经验。今天就把这段 C# 与 MySQL 深度交互的代码分享出来,拒绝教科书式的理论,全是实战干货。
一、 为什么必须使用预处理?
很多人习惯像拼接字符串一样写 SQL语句:
string sql = "SELECT * FROM users WHERE name = '" + inputName + "'";
这种写法在开发小 Demo 时很爽,但一旦上线,遇到高手拿着 SQL注入 脚本试探,你的数据库基本就凉了。在零点博客之前的文章里也提到过,预处理语句 是道红线。C# 的 .NET Core 原生提供了 `SqlParameter`,它能完美隔离数据源和执行逻辑。
二、 C# 连接 MySQL 的底层逻辑
做后端开发,尤其是结合 EMLOG 或类似 CMS 系统时,经常需要直接操作数据库。我的思路是:前端传 JSON 数据过来 -> 后端验证 -> 转义 -> 执行。
1. 核心代码实现:防注入是核心
下面这段代码是一个典型的 API 接口开发案例:
// 获取数据库连接字符串,这里通常是配置文件读取
string connStr = "Server=localhost;Database=test;User=root;Password=xxxx;CharSet=utf8mb4;";
using (MySqlConnection conn = new MySqlConnection(connStr))
{
conn.Open();
// 核心:使用参数化查询,参数名为 @id
string sql = "SELECT id, username, role FROM admin WHERE id = @id";
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
{
// 关键点:添加参数并赋值,底层会自动处理引号转义
cmd.Parameters.AddWithValue("@id", userId);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// 构造返回的 JSON 数据结构
var user = new {
id = reader["id"],
username = reader["username"],
role = reader["role"]
};
// 在这里可以将 user 转换为 JSON 字符串返回给前端
}
}
}
}
三、 JSON 数据的清洗与正则应用
拿到 `reader` 里的数据不能直接塞给前端,这时候就需要处理 JSON 格式的校验。我加了一层正则验证,防止脏数据污染。
bool IsValidJson(string strInput)
{
if (string.IsNullOrWhiteSpace(strInput)) { return false; }
strInput = strInput.Trim();
if ((strInput.StartsWith("{") && strInput.EndsWith("}")) ||
(strInput.StartsWith("[") && strInput.EndsWith("]")))
{
try
{
var obj = JToken.Parse(strInput);
return true;
}
catch
{
return false;
}
}
return false;
}
利用正则表达式,我们可以更进一步,限制用户输入的字符集,比如只允许字母和数字,不符合的直接返回 400 报错。
四、 实战避坑指南(来自博主复盘)
在这次开发在线工具的过程中,我总结了几条教训:
- NULL 值的处理:在执行 Update 语句时,如果某个字段是可选的,传空字符串进 `SqlParameter` 可能会被 MySQL 当作空串而非 NULL。一定要在代码里判断 `IsDBNull`。
- 字符编码:连接字符串一定要带上 `CharSet=utf8mb4`,否则中文插入或查询全是乱码,前端 JS 和后端 C# 都会崩溃。
- SQL 语法拆解:有时候为了灵活性,需要用户自己拼写 SQL语句(在只读权限下)。这时候正则表达式的作用就来了,必须限制用户只能写 SELECT,禁止 DROP 或 INSERT。
五、 总结
开发一个看似简单的在线 SQL 工具,其实包含了从数据库连接池管理、SQL注入 防护,到 JSON 序列化、正则校验的全套后端开发流程。对于想提升 C# 技术栈的同学,建议先去 GitHub 上找找开源的 EMLOG 或博客源码,试着跑起来,再去改写其中的数据库交互层,这样记忆最深刻。
如果你在调试过程中遇到问题,欢迎在评论区留言,零点博客会一一解答。



评论一下吧
取消回复