零点博客技术笔记:C#与EMLOG的“联姻”实录——从SQL注入防护到JSON接口开发

最近在零点博客折腾了一套基于EMLOG的定制化方案,心里一直有个念头:能不能利用C#强大的后端能力来弥补EMLOG原生PHP在处理高并发接口时的短板?这次的技术笔记,我就把这次结合C#/PHP后端开发的复盘过程,毫无保留地分享出来。踩过的坑,必须得填上,也希望能帮到同样在搞在线工具开发的朋友们。

一、 为什么要在EMLOG里写C#?

很多童鞋可能觉得EMLOG是PHP,用C#干嘛?其实很简单,我在做一个爬虫开发的小工具,需要解析大量数据。直接在PHP里正则匹配太累,而且容易内存溢出。于是,我尝试用C#写了一个轻量级的Web API,嵌入到EMLOG的主题或者独立的插件中。

这个过程中,我们需要处理的核心问题只有几个:MySQL数据库操作JSON/XML数据解析,以及最重要的——SQL注入防护

二、 避坑指南:SQL注入防护与预处理语句

这是我这次踩最大的坑。起初为了图方便,我是直接拼接SQL的,结果第二天一看日志,全是错误尝试。后来痛定思痛,把代码重构成了预处理语句

这里必须强调,不管你是用C#还是PHP,SQL注入防护是底线。一旦漏掉,你的数据库就等于裸奔。下面是我封装的一个简单的C#执行逻辑,大家可以参考:

public bool InsertArticle(int $userId, string $title)
{
    // 使用预处理语句,防止SQL注入
    string sql = "INSERT INTO " + DB_TABLE_PREFIX + "blog (title, author) VALUES (@Title, @Author)";

    using (MySqlConnection conn = new MySqlConnection(DB_CONN_STR))
    {
        conn.Open();
        using (MySqlCommand cmd = new MySqlCommand(sql, conn))
        {
            // 绑定参数,数据库会自动转义,比手写.replace()安全得多
            cmd.Parameters.AddWithValue("@Title", $title);
            cmd.Parameters.AddWithValue("@Author", $userId);

            return cmd.ExecuteNonQuery() > 0;
        }
    }
}

大家看,只要用了参数化查询,黑客就算在输入框里输入 `' OR 1=1 --`,数据库也会把它当成普通的字符串处理,而不是执行指令。这才是真正的技术笔记该教给新手的。

三、 前端交互:HTML/CSS/JS 与 JSON/XML

后端搞定了,前端怎么展示?我在EMLOG模板里写了点HTML/CSS/JS,做一个实时的数据加载器。

这个加载器会请求我上面那个C#接口,拿回来的是JSON格式的数据。解析JSON其实很简单,现在的JS引擎对JSON支持都很好,但我为了兼容老浏览器,还是手写了几个解析逻辑:

function parseJsonData(jsonStr) {
    try {
        // 尝试直接解析
        let data = JSON.parse(jsonStr);
        renderData(data);
    } catch (e) {
        // 如果JSON格式不对,可能返回的是XML,做个兜底
        console.log("JSON解析失败,尝试XML");
        parseXmlData(jsonStr);
    }
}

另外,在做爬虫开发的时候,对方返回的可能是XML。我在这个JSON/XML数据解析的函数里,顺便加了几个正则表达式,用来提取XML中的核心节点。正则这东西,写好了是神器,写不好就是废铁。

// 提取XML里的节点内容,防止格式脏乱
function getXmlTagContent(xmlStr, tagName) {
    const regex = new RegExp(`<${tagName}>(.*?)</${tagName}>`, 's');
    const match = xmlStr.match(regex);
    return match ? match[1] : '';
}

四、 底层拆解:爬虫与工具开发的精髓

最后,再聊聊这个爬虫开发的底层逻辑。为了把数据同步到零点博客,我写了一个定时任务。它并不复杂:

  • 1. 发起HTTP请求(GET/POST)。
  • 2. 获取响应体,根据Content-Type判断是解析JSON还是HTML。
  • 3. 用正则表达式提取关键字段(标题、摘要、链接)。
  • 4. 存入EMLOG的MySQL数据库。

难点不在于这些步骤,而在于异常处理频率控制。尤其是在做在线工具开发时,如果你没有对接口做限流,或者没有做异常捕获,服务器很容易崩溃。

五、 总结

这次在零点博客的折腾,让我对结合C#/PHP后端开发有了更深的理解。虽然PHP跑得快,但C#在处理复杂数据结构和业务逻辑时更稳健。

如果你也在做博客开发,或者搞接口开发,记住一句话:SQL注入防护是第一生命线,预处理语句永远比字符串拼接好。** 别为了省那几行代码,把自己的博客做成黑客的游乐场。

这次的技术笔记就到这里,源码案例我会整理好放在零点博客的【资源分享】栏目,大家感兴趣的可以进去搜一下。