C#与MySQL实战:如何用预处理语句彻底解决EMLOG接口的SQL注入问题?

C#与MySQL实战:如何用预处理语句彻底解决EMLOG接口的SQL注入问题?

零点阁主 2026-10-15 0 0

本文是一篇零点博客出品的C#后端开发实操教程,深入剖析如何结合C#与MySQL为EMLOG搭建安全接口。从JSON数据解析到核心的SQL注入防护,全程避坑,包含真实源码案例,助你掌握底层逻辑。

写在前面

最近在零点博客折腾后端重构,把原本的PHP部分逐步迁移到了C#。在涉及EMLOG数据库交互的时候,我发现很多初学者甚至老手都容易在接口开发中栽跟头——尤其是数据安全这块。今天不整虚的,直接开一篇实操教程,咱们从零搭建一个安全的文章查询接口,重点讲讲SQL注入防护和JSON数据解析,全程干货,拒绝AI套话。

一、 为什么我们需要预处理语句?

很多人直接拼接SQL字符串,比如:

string sql = "SELECT * FROM emlog_blog WHERE title = '" + userText + "'";

兄弟们,这要是遇到恶意的输入 " OR 1=1 --,你的数据库分分钟就崩了。这是典型的SQL注入。为了保证底层逻辑的稳健,我们必须使用预处理语句。

二、 实战:C# 调用 MySQL 并返回 JSON 数据

咱们来写一个最基础的查询接口,模拟爬虫或者前端获取EMLOG文章列表的场景。

1. 引用必要的 NuGet 包

记得先安装 MySql.Data 包。

2. 核心代码实现

using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using System.Text.Json; // 引入JSON序列化

public class ArticleApi
{
    // 数据库连接字符串,请根据你的环境修改
    private static string connStr = "Server=localhost;Database=emlog;Uid=root;Pwd=123456;";

    public void GetArticles()
    {
        // 使用 try-catch 保证程序健壮性
        try
        {
            using (MySqlConnection conn = new MySqlConnection(connStr))
            {
                conn.Open();
                // 1. 编写带参数的SQL
                string sql = "SELECT gid, title, content FROM emlog_blog ORDER BY gid DESC LIMIT 10";

                // 2. 创建命令对象并绑定参数
                using (MySqlCommand cmd = new MySqlCommand(sql, conn))
                {
                    // 3. 使用参数化查询(核心防注入)
                    // 即使传入的参数包含特殊字符,数据库也会把它当成普通文本处理
                    cmd.Parameters.AddWithValue("@gid", 0);

                    // 4. 执行查询
                    using (MySqlDataReader reader = cmd.ExecuteReader())
                    {
                        var articles = new List<Dictionary<string, object>>();

                        // 5. 读取数据并填充列表
                        while (reader.Read())
                        {
                            var item = new Dictionary<string, object>();
                            item.Add("id", reader["gid"]);
                            item.Add("title", reader["title"]);
                            item.Add("content", reader["content"]); // 实际开发中建议截断长度
                            articles.Add(item);
                        }

                        // 6. 将对象列表转换为 JSON 字符串返回给前端或爬虫
                        string jsonString = JsonSerializer.Serialize(articles);
                        Console.WriteLine(jsonString);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            // 记录错误日志,千万别直接输出敏感信息
            Console.WriteLine("Error: " + ex.Message);
        }
    }
}

三、 避坑指南与正则表达式的作用

接口写好了,不代表万事大吉。前端的输入往往也是不可信的。在这里,正则表达式就派上用场了。

假设用户在前端输入了一个很长的标题或者包含脚本标签的内容,我们可以在数据进入C#层之前,先用正则清洗一下:

// 简单的 XSS 和 长度过滤
public bool ValidateInput(string input)
{
    // 移除 script 标签等危险字符
    string cleanInput = System.Text.RegularExpressions.Regex.Replace(input, @"<script>.*?</script>", "");

    // 限制长度,防止超长输入拖垮查询
    if (cleanInput.Length > 100)
        return false;

    return true;
}

四、 总结

通过这篇实操教程,相信大家已经掌握了在C#环境下如何安全地操作MySQL数据库。核心就两点:1. 永远不要拼接SQL字符串,使用预处理语句;2. 善用正则表达式做输入清洗。

无论是做在线工具开发,还是爬虫抓取EMLOG数据,安全永远是第一位的。下次写接口时,记得回头看看这篇复盘,别再犯老毛病了。代码已跑通,有问题的可以在评论区留言。

点赞 (0) 充电 分享

评论一下吧

昵称*
邮箱
个人主页
sitemap