重构零点博客:C#接口对接EMLOG数据库与SQL注入防护实战笔记

大家好,我是零点博客的开发者。最近在整理技术笔记时,发现博客后端与前端的数据交互还有优化空间,尤其是针对EMLOG生态的API开发。今天不整虚的,直接分享我是如何用C#开发一套对接EMLOG的接口服务,以及如何在过程中搞定MySQL数据库操作、防止SQL注入和解析JSON数据的实操过程。

一、 项目背景与需求

我们的目标是让零点博客的首页加载更快,数据交互更灵活。直接用PHP运行EMLOG虽然稳定,但在高并发下处理复杂的计算逻辑(比如数据聚合、图表生成)略显吃力。于是,我利用业余时间写了一个C#的后台服务,专门用来处理数据库查询并返回接口,前端JS直接拿数据渲染。

1. 技术选型:C# 结合 EMLOG

这里需要注意,EMLOG本身是PHP环境,我们要做的是“读取”而不是“写入”(除非接口做了权限验证)。我们通过读取EMLOG的数据库配置文件获取连接信息,利用C#的MySql.Data包建立连接。

二、 核心难点:SQL注入防护与预处理

在技术笔记里,最忌讳的就是直接拼接SQL。为了安全,我强制要求所有数据库操作必须使用预处理语句

1. 底层原理

简单的字符串拼接(例如 "SELECT * FROM blog WHERE title='" + keyword + "'")极易被黑客利用。预处理语句将SQL结构先发送给数据库编译,参数值在之后发送,这样即使参数里包含恶意代码,数据库也会将其视为普通文本处理。

2. 代码实战

using (MySqlConnection conn = new MySqlConnection(connStr))
{
    conn.Open();
    // 使用参数化查询,防止SQL注入
    string sql = "SELECT title, content FROM emlog_post WHERE log_id = @LogId";
    MySqlCommand cmd = new MySqlCommand(sql, conn);
    cmd.Parameters.AddWithValue("@LogId", postId);

    using (MySqlDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // 读取数据并构建JSON对象
            var post = new {
                Title = reader["title"].ToString(),
                Content = reader["content"].ToString()
            };
            result.Add(post);
        }
    }
}

这段代码就是我之前遇到的坑点:一开始直接在SQL里拼接了变量,结果一次恶意测试就把测试库删了(幸好有备份)。改用`Parameters.AddWithValue`后,问题迎刃而解。

三、 数据交互:JSON解析与接口开发

接口写好了,接下来就是怎么给前端看。C#处理JSON非常方便,我使用的是Newtonsoft.Json库。

1. 返回JSON格式

后端直接输出JSON字符串,前端AJAX请求即可。为了方便调试,我开启了Swagger或者简单的测试页面。

var serializer = new JsonSerializer();
var json = JsonConvert.SerializeObject(result);
context.Response.ContentType = "application/json";
context.Response.Write(json);

2. 正则表达式的妙用

EMLOG生成的文章内容里通常带有大量的HTML标签。为了让前端展示更清爽,我在返回数据前用正则表达式做了一次简单的清洗:

// 移除HTML标签,只保留纯文本
string plainText = Regex.Replace(htmlContent, "<[^>]*?>", " ");
// 或者截取摘要
string summary = Regex.Match(plainText, ".{0,100}...").Value;

四、 爬虫开发辅助与避坑指南

在做这套系统时,我还顺便写了一个简单的爬虫,用来抓取其他行业博客的最新文章,然后整合到零点博客的“推荐阅读”板块。这完全是基于刚才建立的接口实现的。

避坑指南:

  1. 连接池耗尽: 在高并发下,MySQL连接一定要及时关闭,使用`using`语句块是必须的,否则服务挂得很快。
  2. 编码问题: EMLOG数据库如果是UTF8mb4,C#连接字符串记得加上`CharSet=utf8mb4`,否则中文会乱码。
  3. 接口超时: 如果查询数据量太大,JS端要设置合适的timeout,否则看起来像是卡死了。

五、 总结

通过这次开发,我深刻体会到了技术笔记的记录价值。很多坑只有亲自踩过才能记住。将C#的强类型优势引入EMLOG生态,不仅能提升性能,还能通过预处理语句保障安全。大家如果有兴趣,可以参考我的源码来修改自己的博客结构。

关注零点博客,获取更多前端开发、爬虫开发以及C#后端的干货教程。