写在前面:项目折腾记

大家好,我是零点博客的开发者。最近在研究基于C#的爬虫开发,想要写一个工具,把网上抓取的数据自动同步到自己的EMLOG博客里。过程那是相当曲折,不仅要搞定HTML解析,还要处理和MySQL数据库的交互。特别是当我想直接把抓到的字符串拼接到SQL语句里时,差点就踩了大坑。今天这篇,就作为避坑指南,把我在C#对接EMLOG过程中遇到的SQL注入风险和乱码问题给大家复盘一下,全是干货,建议收藏。

一、 为什么拼接SQL语句是大忌?

刚开始写爬虫接口时,我想着反正是在本地跑,为了图方便,我直接写了这种代码:

string title = Regex.Match(html, "<h1>(.*?)</h1>", RegexOptions.IgnoreCase).Groups[1].Value;
string sql = $"INSERT INTO emlog_blog (title, content, uid) VALUES ('{title}', 'test', 1);";

虽然看起来没问题,但一旦这个抓取到的`title`里带了单引号(比如《Don't Stop》),数据库立马报错,或者更严重的是,如果有人恶意构造抓取链接,直接把`1' OR '1'='1`塞进来,你的MySQL表就遭殃了。这就是典型的SQL注入。对于想走技术深度的博主来说,这绝对是零容忍。

二、 底层拆解:预处理语句的正确姿势

解决这个问题的核心,就是使用预处理语句。这不仅是规范,更是为了安全。

在C#中,我们通常使用MySql.Data或者MySQL Connector/NET。下面我放一个真实的实操案例,展示如何用参数化查询来存入EMLOG:

string connStr = "Server=localhost;Database=emlog;Uid=root;Pwd=root;";
using (MySqlConnection conn = new MySqlConnection(connStr))
{
    conn.Open();
    string sql = "INSERT INTO emlog_blog (title, content, date, author, uid) VALUES (@Title, @Content, @Date, @Author, @Uid);";

    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@Title", title); // 自动转义特殊字符
        cmd.Parameters.AddWithValue("@Content", cleanContent);
        cmd.Parameters.AddWithValue("@Date", DateTime.Now);
        cmd.Parameters.AddWithValue("@Author", "Zero");
        cmd.Parameters.AddWithValue("@Uid", 1);

        cmd.ExecuteNonQuery();
    }
}

看,用了`Parameters`,无论title里有多少单引号、双引号,数据库都会把它们当成普通文本处理,彻底消除了SQL注入隐患。

三、 避坑指南:乱码与JSON/XML解析

除了注入,还有一个让新手头秃的问题就是中文乱码。爬虫抓取网页,后台处理成JSON/XML数据,最后存入MySQL,如果编码不一致,全是问号。

避坑关键点:

  1. 连接字符串加字符集:`Charset=utf8;` 或者 `CharSet=utf8mb4;`,这个很重要。
  2. 确保源头正确:在C#里解析网页时,记得加上`User-Agent`,有的网站不让你爬,或者返回的数据不是标准的UTF-8。

此外,现在的接口开发趋势是前后端分离。如果我们的爬虫工具不仅存数据库,还要提供一个Web接口给前端调用,那么**JSON**的格式化解析也不能马虎。通常我会用`System.Text.Json`或者Newtonsoft.Json,注意对象的序列化策略,避免把敏感信息(如密码)误输到日志里。

四、 总结与源码分享

在线工具开发其实就是这样,细节决定成败。从最开始的HTML/CSS/JS布局,到后端的逻辑处理,每一个环节都需要严谨。这次在零点博客上线这个爬虫对接EMLOG的小工具,最大的收获就是重新温习了一遍SQL注入防护的知识。

最后,我把这个案例的源码整理好放在了网盘里,包含了一个简单的正则提取工具和数据库连接类。如果你也想折腾自己的博客系统,不妨下载看看,少走弯路才是硬道理!