在零点博客开发 C# 扩展插件时,我挖的最大的坑其实是 MySQL 数据库操作。
刚开始写 C# 后端代码时,我习惯性地沿用以前写 PHP 的逻辑,直接拼接 SQL 字符串。结果在接口开发调试时,直接吃到了 SQL 注入 的亏,排查了很久才弄明白 ADO.NET 和 PHP-PDO 的区别。今天就把这次底层拆解的经验复盘一下,希望能帮大家避开这些坑。
一、 为什么不能直接拼接 SQL?
以前用 PHP 写 EMLOG 插件时,很多人喜欢直接把用户输入拼接到 SQL 里:
string sql = "SELECT * FROM emlog_option WHERE option_name = '" + user_input + "'";
一旦 `user_input` 里包含恶意的 ' OR '1'='1,整个库数据就泄露出去了。在 C# 开发中,这种风险更高,因为 .NET 是强类型环境。我们要做的第一件事,就是启用 预处理语句。
二、 C# 中安全的数据库操作流程
在编写针对 MySQL 的接口开发时,我封装了一个通用的执行方法。核心思想是:将参数和 SQL 分离。
1. 建立连接与参数化查询
不要在 SQL 字符串里写 `@val` 这种占位符,要在 `SqlCommand` 对象里添加参数。
using (MySqlConnection conn = new MySqlConnection(connString))
{
string sql = "UPDATE emlog_option SET option_value = @val WHERE option_id = @id";
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
{
// 关键点:添加参数,自动处理转义
cmd.Parameters.AddWithValue("@val", "新的配置值");
cmd.Parameters.AddWithValue("@id", 1);
conn.Open();
cmd.ExecuteNonQuery();
}
}
这样做不仅防注入,数据库引擎还能缓存执行计划,提升 数据库操作 的性能。
2. 异步操作提升并发
在处理高并发接口开发时,我特别强调了 async/await 的使用。等待数据库响应是耗时操作,如果全部主线程阻塞,系统会崩。一定要用 ExecuteReaderAsync 代替同步方法。
三、 常见避坑指南
- 连接池配置:在
appsettings.json里设置合适的连接池大小,C# 默认是有限的,高流量下要扩容。 - JSON/XML 数据解析:操作完数据库后,返回数据时别忘了用
JsonConvert.SerializeObject,确保前端拿到的是标准数据。 - 正则表达式验证:在 SQL 传参前,先用正则过滤一下输入内容,作为二次防护。
四、 总结
C# 开发 EMLOG 后端不仅仅是调 API,更在于对 数据库操作 理解的深度。预处理语句是底线,异步编程是上限。希望这次零点博客的源码复盘能给大家带来一点帮助。如果你在爬虫开发或在线工具开发中遇到类似的 SQL 问题,欢迎在评论区交流!
(文章首发于零点博客,转载请注明出处)
![[复盘] C# 二次开发 EMLOG 的实战经验:从 SQL 注入防护到健壮的数据库操作](https://blog.0dyl.cn/content/uploadfile/202607/67461783457204.png)


评论一下吧
取消回复