C# + EMLOG实战:手写原生 **SQL 语句** 实现数据过滤与防注入优化

大家好,我是零点博客的博主。今天不整虚的,直接拿上周开发一个 EMLOG 数据迁移工具的实际案例,来聊聊在 C# 后端开发中,SQL 语句到底该怎么写才够“野”、够安全。

背景:为什么我们还要手动写 SQL?

很多新手开发一上来就爱上 EF Core 或 Dapper,恨不得所有业务都扔给 ORM 自动生成。但在做 EMLOG 数据清洗工具时,我发现当需要进行批量数据筛选动态拼接条件时,手动构建高性能的 **SQL 语句** 往往比 ORM 更直观,也更可控。

1. 数据清洗场景与正则的配合

我们的目标是清理过期的博客文章。首先,前端接收了一个 ID 列表(JSON 格式),我们需要在后端将其解析。

string jsonIds = "{\"ids\": [1, 5, 10]}";
var idsObj = JsonConvert.DeserializeObject<dynamic>(jsonIds);
List<int> ids = new List<int>();
foreach (var id in idsObj.ids) {
    ids.Add(Convert.ToInt32(id));
}
// 这里我们下一步要处理这些 ID

解析完 ID 后,核心来了。如果直接字符串拼接,结果就是一场 SQL 注入的噩梦。我们必须利用正则表达式先对输入做一道基础校验,确保传入的参数合法。

2. 避坑指南:SQL 注入与预处理语句

很多人不懂,为什么要用预处理?其实原理很简单:**SQL 语句** 是先在数据库解析成执行计划,参数才是后来带进去的。这样数据库就不可能把你的变量当成指令执行。

以下是结合 C# 和 MySQL 的核心代码,我们手写一条 IN 查询的 **SQL 语句**:

string sql = "SELECT * FROM emlog_blog WHERE status = 1 AND lid IN (@Ids)";
using (MySqlConnection conn = new MySqlConnection(connString)) {
    conn.Open();
    using (MySqlCommand cmd = new MySqlCommand(sql, conn)) {
        // 关键点:使用参数化查询
        cmd.Parameters.AddWithValue("@Ids", string.Join(",", ids));

        using (MySqlDataReader reader = cmd.ExecuteReader()) {
            while (reader.Read()) {
                // 处理每一行数据,转换为 JSON 供前端调用
                var article = new {
                    title = reader["title"],
                    date = reader["date"],
                    content = reader["content"]
                };
                // 这里是实时输出,实际开发可存入 List 供返回
                Console.WriteLine(JsonConvert.SerializeObject(article));
            }
        }
    }
}

看,这行代码中,`@Ids` 作为一个占位符,无论你传入什么攻击脚本,数据库引擎看到的永远只是一个 ID 值。这就是预处理语句的奥义。

3. 前端交互:HTML/CSS/JS 的展示与性能优化

后端把数据变成 JSON 传回来,前端该如何利用?我们不能傻乎乎地把所有文章一次炸在页面上。最好是用一个在线工具的思路,做一个筛选视图。

比如,我们用 CSS Grid 布局展示卡片,通过 JS 监听搜索框输入,动态发起 Fetch 请求。这样用户每敲一次键盘,可能只是发一个简单的 ID 查询请求,而不是让后端重新执行一次全表扫描。

// 前端简单的示例代码
function searchArticles() {
    // 获取当前页面的 ID 集合
    let activeIds = getCurrentIds();

    // 发送 POST 请求给 C# 后端
    fetch('/api/search', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ ids: activeIds })
    })
    .then(res => res.json())
    .then(data => {
        renderCards(data); // 更新 DOM
    });
}

总结:底层拆解与核心心法

做开发这么多年,我总结了一点:越是底层的逻辑,越不能依赖黑盒工具。今天我们复盘了:

  1. C# 后端如何结合正则表达式进行数据清洗;
  2. 如何手写高效且安全的SQL 语句(特别是 IN 查询和参数化);
  3. 数据如何转换为 JSON 交互,以及前端如何优化渲染。

如果你正在开发类似 EMLOG 这样的 CMS 或爬虫工具,希望这篇实战复盘能帮你避掉那些容易掉进去的坑。记得,写 **SQL 语句** 的时候,多看一眼参数化,性能和安全就能提升一个档次。

关注零点博客,获取更多 C#、PHP 及各类开发工具的原创干货!