前言:EMLOG与C#的奇妙碰撞

大家好,我是零点博客的主理人。最近在研究一些轻量级CMS的内容抓取与二次开发,EMLOG因其轻便高效,成为了不少个人站点的首选。但默认的接口有时候无法满足我们后端开发的需求。

今天,我们不整虚的,直接上干货。以底层逻辑拆解为核心,带大家通过 C# 语言,直接操作 MySQL 数据库,手动编写一个带参数化查询的安全接口,将 EMLOG 的文章数据清洗并转换为 JSON 返回。在这个过程中,我会重点演示如何用正则表达式提取内容,以及如何通过预处理语句杜绝 SQL 注入。

一、 为什么我们要自己写接口?

EMLOG 官方的 Feed 接口通常只包含文章 ID 和标题,内容往往是截断的。如果你想做内容聚合,或者给小程序/移动端提供精准数据,就必须钻到数据库里去。

这听起来很危险?没错,这就涉及到了今天最大的底层逻辑:如何在不打开 MySQL 管理工具的情况下,安全地获取数据?

二、 环境准备与数据表结构

我们需要准备:

  • Visual Studio 环境 (C# .NET 6/8)。
  • MySQL Connector/NET (用于连接数据库)。
  • 目标 EMLOG 的数据库信息(表前缀默认为 emlog_)。

核心表只有两个:emlog_blog(文章主表)和 emlog_attachment(图片表)。我们要查询的是文章内容(content 字段)和标题(title)。

三、 核心逻辑:C# 拉取与正则清洗

在拿到数据后,EMLOG 的文章内容里往往包含很多 HTML 标签和恶意代码,这时候正则表达式就派上用场了。我打算写一个简单的工具,输入文章内容,自动剥离标签,只保留纯文本。

using System;
using System.Data.SqlClient; // 必须引用数据库驱动
using System.Text.RegularExpressions; // 正则必备

public class EmlogFetcher
{
    // 数据库连接字符串,请替换为你自己的配置
    string connStr = "Server=localhost;Database=emlog_db;Uid=root;Pwd=your_password;";

    public string GetCleanContent(int articleId)
    {
        string sql = "SELECT content FROM emlog_blog WHERE lid = @id AND hide = 0";
        string content = "";

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            conn.Open();
            // 关键点1:底层逻辑拆解 - 使用预处理语句
            // 千万不要拼接字符串 ("SELECT ... WHERE id=" + id),这是 SQL 注入的重灾区!
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@id", articleId);

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    content = reader.GetString(0); 

                    // 关键点2:正则表达式清洗
                    // 匹配 <p> 标签中间的内容,或者直接剥离所有 HTML 标签
                    content = Regex.Replace(content, "<[^>]*>", "");

                    // 去除多余空白
                    content = Regex.Replace(content, @"\s+", " ");
                }
            }
        }
        return content.Trim();
    }
}

四、 避坑指南:SQL 注入与预处理语句

很多新手在写 PHP 或 C# 时喜欢这样做:

// 错误示范,千万别学!
string sql = "SELECT * FROM emlog_blog WHERE title LIKE '%" + userInput + "%'";

这会怎么样?如果一个黑客传入 `1' OR '1'='1`,他就会绕过你的登录验证,甚至窃取全库数据。这就是为什么我们强调底层逻辑的重要性:永远不要相信用户输入的数据。

在上述代码中,我使用了 `Parameters.AddWithValue`。C# 会自动把变量当成“纯文本”处理,而不是“代码”,从而彻底封死 SQL 注入的入口。

五、 实战演示:构建简易的 API 接口

有了上面的清洗逻辑,我们再封装一层,直接返回 JSON 格式的数据,方便前端调用。

// 模拟 Controller 层
public object GetArticleJson(int id)
{
    string rawContent = GetCleanContent(id);
    // 构造简单的返回对象
    return new 
    { 
        code = 200, 
        data = new 
        { 
            id = id, 
            title = "C# 深入理解预处理语句", 
            content = rawContent, 
            create_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 
        } 
    };
}

前端只要发一个 GET 请求,就能拿到干净的 JSON 数据。这里没有使用 ADO.NET 的 `DataSet` 和 `DataTable`,而是直接用字符串拼接简单的 JSON 对象。这是为了保证性能,避免生成不必要的中间对象。

总结

今天在零点博客和大家复盘了一下 C# 对接 EMLOG 的全过程。从 SQL 注入的**底层原理**,到正则表达式的**实战应用**,再到接口开发的**JSON 解析**,每一步都是代码背后的逻辑。

开发中最大的坑往往不是功能做不出来,而是对安全机制的忽视。希望这个案例能帮到正在做后端开发的你。后续我还会出关于 EMLOG 模板开发中的 CSS 布局避坑教程,记得关注!