C#实战:爬虫提取内容并适配EMLOG数据库,手把手教你用预处理语句防SQL注入

在零点博客折腾了一段时间,发现手动搬运文章效率太低。最近正好在研究C#开发,索性写了个简单的爬虫开发小工具,希望能自动把一些技术干货存进数据库,甚至直接给EMLOG发文章。

以前总觉得SQL注入离自己很远,直到那天看到论坛有人吐槽因为直接拼接SQL导致全站被拖库,才意识到SQL注入防护是多么重要。今天就把这次从爬虫开发到后端开发的完整复盘贴出来,核心就是如何用C#的安全机制搞定MySQL数据库操作。

一、C#爬虫开发:从网页到正则提取

首先,我们要获取目标网页的HTML源码。这里用到了HttpWebRequest,为了防止反爬,还得加上User-Agent和Cookie。拿到HTML后,最核心的就是正则表达式了。

比如我们要提取文章标题和正文:

string html = response.ReadToEnd();
// 真人复盘:这里一定要用RegexOptions.Singleline,否则遇到换行符就断了
MatchCollection matches = Regex.Matches(html, "<title>(.+?)</title>", RegexOptions.IgnoreCase);
if (matches.Count > 0)
{
    string title = matches[0].Groups[1].Value;
    // 提取正文逻辑省略...
}

拿到纯文本后,接下来就是对接后端了。

二、底层拆解:为什么必须用预处理语句?

很多新手像我一样,喜欢直接拼接字符串。比如:

string sql = "INSERT INTO log (title, content) VALUES ('" + title + "', '" + content + "')";

这很爽,写起来快,但如果你去攻击这个接口,或者你的数据库里存了单引号(比如用户名),整个SQL结构就崩了。这是典型的SQL注入漏洞。

在后端开发中,C#的接口开发一定要走预处理。我们可以用MySql.Data驱动来实现,把变量参数化:

string sql = "INSERT INTO emlog_log (title, content, uid, date) VALUES (@title, @content, 1, NOW())";
using (MySqlConnection conn = new MySqlConnection(connString))
{
    conn.Open();
    using (MySqlCommand cmd = new MySqlCommand(sql, conn))
    {
        // 关键步骤:参数化查询
        cmd.Parameters.AddWithValue("@title", title);
        cmd.Parameters.AddWithValue("@content", content);
        cmd.ExecuteNonQuery();
    }
}

看到没?参数本身就是字符串,数据库引擎会把它当成纯数据,从根本上杜绝了SQL注入风险。

三、实操避坑指南

在开发过程中踩了几个坑,顺便分享给大家:

  • 字符编码问题:读取网页HTML时,一定要指定编码为UTF-8,否则存入MySQL数据库全是乱码。
  • JSON/XML解析:如果爬虫接口返回的是JSON格式,直接用Newtonsoft.Json或者System.Text.Json解析对象即可,比手动取字符串方便太多。
  • 接口超时:爬虫网络请求别写死5秒超时,如果目标站卡了,你的程序也得卡。

最后,这个工具不仅能发文章,还能作为在线工具开发的一个雏形。以后打算加个前端界面,把爬取的数据整理成Markdown格式导出,或者直接提供API给PHP后端调用。

总之,C#在数据处理和MySQL操作上真的很稳,只要把安全规范(如预处理语句)立住了,后续开发就会顺畅很多。