零点博客实战:C# 实现 EMLOG 数据库 SQL 防注入与 JSON 解析的代码案例

大家好,我是零点博客的博主。最近在写一套 EMLOG 辅助查询工具时,发现很多新人在处理后端接口开发时,最容易在安全性和数据处理上翻车。今天咱们不扯虚的,直接通过一个具体的代码案例,把 C# 连接 MySQL、SQL注入防护 以及 JSON数据解析 这几个核心知识点串联起来。

这套流程是做在线工具开发的基础,也是后端开发的必修课。


一、 需求背景与选型

我们的目标是开发一个工具,能够读取零点博客技术栈中常见的 EMLOG 博客系统的文章列表。EMLOG 默认使用 MySQL 数据库,字段通常包含日志ID、标题、内容摘要等。

二、 核心代码案例:连接与安全查询

在这个代码案例中,最关键的一点是拒绝字符串拼接,而是使用预处理语句来防止 SQL 注入。这是后端开发必须守住的底线。

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace ZeroPointBlogTool
{
    public class EmlogHelper
    {
        // 数据库连接字符串,建议配置在Web.config中
        private static string connStr = "Server=localhost;Database=emlog_db;Uid=root;Pwd=123456;charset=utf8mb4;";

        /// <summary>
        /// 获取文章列表(含防注入处理)
        /// </summary>
        public static string GetArticleListJson()
        {
            // 初始化数据集合
            var articleList = new List<Dictionary<string, object>>();
            string jsonResult = string.Empty;

            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    // 核心点:使用 @ParameterName 代替字符串拼接
                    string sql = "SELECT title, content, author FROM emlog_blog WHERE gid > 0 ORDER BY gid DESC LIMIT 10";

                    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                    {
                        // 预处理参数,防止SQL注入攻击
                        // 这里演示了基本查询,如果是查询条件,直接 cmd.Parameters.AddWithValue("@gid", inputId);

                        using (MySqlDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                var item = new Dictionary<string, object>
                                {
                                    { "title", reader["title"].ToString() },
                                    { "content", reader["content"].ToString() },
                                    { "author", reader["author"].ToString() }
                                };
                                articleList.Add(item);
                            }
                        }
                    }

                    // 数据解析与序列化
                    jsonResult = JsonConvert.SerializeObject(articleList, Formatting.Indented);
                }
                catch (Exception ex)
                {
                    // 生产环境应记录日志,不要直接返回异常信息
                    return $"{{\"error\":\"数据库连接失败: {ex.Message}\"}}";
                }
            }
            return jsonResult;
        }
    }
}

三、 实操步骤与底层拆解

为了让你彻底搞懂,我把上面的代码案例拆开讲:

  1. 引入 NuGet 包: C# 操作 MySQL 需要 MySQL.Data 库,解析 JSON 需要 Newtonsoft.Json(Json.NET)。这是 .NET 开发的标准操作。
  2. 连接池管理: 代码中使用了 `using` 语句,这会自动调用 `Dispose()` 释放数据库连接,避免连接泄漏。在开发在线工具时,这点非常重要。
  3. 参数化查询: 注意看 cmd.Parameters.AddWithValue。如果用户输入 `1' OR '1'='1`,如果不做处理,SQL 语句会变成 `... WHERE title LIKE '%1' OR '1'='1%'`,直接导致数据泄露。预处理语句能彻底堵死这个坑。
  4. JSON 解析: 我们拿到了 `DataTable` 或 `DataReader` 数据后,用 `JsonConvert.SerializeObject` 转成 JSON 字符串。这是前后端数据交互的标准格式。正则表达式也可以配合 JSON 解析来清洗敏感数据,比如过滤 HTML 标签。

四、 避坑指南

在复盘中,我发现大家在写这类工具时,容易踩以下坑:

  • 编码问题: 数据库连接字符串里一定要加 `charset=utf8mb4`,否则 EMLOG 这种支持中文和特殊表情的博客系统,查出来的中文全是乱码。
  • 缺少异常捕获: 数据库操作必须包裹在 try-catch 中。如果是前端接口,错误信息要尽量脱敏,不要把报错堆栈直接扔给用户看,显得很不专业。

五、 总结

这就是零点博客为大家整理的一套从数据库连接到数据输出的完整流程。通过这个代码案例,你应该能明白为什么后端开发要强制使用预处理语句。掌握了这个,你就打通了 C# + MySQL + JSON 的任督二脉。

如果你对爬虫开发或者正则提取感兴趣,欢迎关注我的后续更新。咱们下期实战见!