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操作上真的很稳,只要把安全规范(如预处理语句)立住了,后续开发就会顺畅很多。



评论一下吧
取消回复