C# 实战复盘:零点博客接入 EMLOG 接口并构建高安全性的 SQL 防注入方案

大家好,我是老陈。最近在维护我的“零点博客”时,遇到了一个经典的需求:如何利用现有的 EMLOG 资源,通过 C# 强大的后端能力,实现文章数据的平滑迁移与同步?

今天不整虚的,直接通过一个实操案例,聊聊我如何用 C# 调用 EMLOG 的 API 接口,获取 JSON 数据,并重点剖析在处理 MySQL 数据库操作时,如何杜绝 SQL注入 的隐患。

一、 需求背景:从 EMLOG 到零点博客的数据打通

EMLOG 是一套老牌的 PHP 博客系统,很多个人站长手里都有。为了不浪费这些数据,我决定在“零点博客”的 C# 后端开发中,增加一个“导入 EMLOG 文章”的功能。

我的思路很清晰:前端页面传参数 -> C# 后端发起请求 -> 获取 EMLOG 返回的 XML 或 JSON 数据 -> 解析后存入零点博客的 MySQL 数据库。

二、 C# 调用接口与 JSON 解析

首先,我们需要解决数据获取的问题。我使用的是 .NET Core 自带的 HttpClient 进行 HTTP 请求。

public async Task<List<BlogArticle>> GetEmlogDataAsync(int limit)
{
    using (var httpClient = new HttpClient())
    {
        // 模拟请求 EMLOG 接口,这里使用公开的示例接口
        var response = await httpClient.GetAsync($"http://example.com/api.php?action=article&limit={limit}");
        string jsonContent = await response.Content.ReadAsStringAsync();

        // 使用反序列化库将 JSON 转换为对象
        var result = JsonConvert.DeserializeObject<EmlogApiResponse>(jsonContent);
        return result.Data;
    }
}

拿到数据后,解析 JSON 只是第一步。为了保证数据纯净,我还用到了正则表达式来清理文章内容中的无用 HTML 标签。比如,只保留 p、h1-h6 标签,去除 script 标签等。

// 简单的正则清洗示例
var cleanContent = Regex.Replace(rawHtml, "<[^>]+>", "").Trim();

三、 痛点:SQL 注入风险与预处理语句的必要性

这是很多初学者最容易踩的坑。在 C# 中连接 MySQL 时,如果直接把前端传来的变量拼接到 SQL 字符串里,SQL注入 随时可能发生。

举个反面教材,如果你像下面这样写,黑客可以在输入框里注入恶意代码:

// ❌ 错误示范:直接拼接字符串
string sql = $"SELECT * FROM articles WHERE id = '{inputId}'";

为了解决这个问题,我必须使用预处理语句。MySQL Connector 提供了 `MySqlCommand` 和 `Parameters` 属性,它能强制参数作为数据值处理,而不是作为 SQL 代码执行。

四、 C# MySQL 防注入终极方案

在“零点博客”的数据同步代码中,我采用了参数化查询。这样做不仅能防注入,还能让数据库驱动自动优化 SQL 执行计划。

public void SaveArticle(string title, string content, int authorId)
{
    using (var conn = new MySqlConnection(connectionString))
    {
        await conn.OpenAsync();
        string sql = @"INSERT INTO articles (title, content, author_id, create_time) VALUES (@Title, @Content, @AuthorId, @Time);";

        using (var cmd = new MySqlCommand(sql, conn))
        {
            // 关键点:使用参数化查询
            cmd.Parameters.AddWithValue("@Title", title);
            cmd.Parameters.AddWithValue("@Content", content);
            cmd.Parameters.AddWithValue("@AuthorId", authorId);
            cmd.Parameters.AddWithValue("@Time", DateTime.Now);

            await cmd.ExecuteNonQueryAsync();
        }
    }
}

通过这种方式,无论用户输入什么,C# 都会将其视为纯文本数据,彻底消除了安全漏洞。

五、 总结与源码获取

通过这次开发,我发现将C# 后端开发与老旧的 PHP EMLOG 系统结合,是一种非常灵活的开发模式。我们利用 C# 处理复杂的业务逻辑、解析 JSON/XML 以及确保数据库安全,而前端则专注于 HTML/CSS/JS 的页面展示。

这套“零点博客”的同步插件源码及完整的操作文档我已经整理好了。如果你在开发中也遇到了类似的接口对接或 SQL 注入防护问题,欢迎在评论区留言,或者通过站内信获取完整源码。

记住,预处理语句不是加分项,而是构建安全 Web 应用必备的基础设施。