零点博客复盘:C# EMLOG爬虫开发与SQL注入防御实操
大家好,我是你们的博主。最近在搭建零点博客时,为了统计全站数据,我捣鼓了一个 C# 写的 EMLOG 爬虫。在这个过程中,我发现很多新手容易忽视SQL注入防护,或者在前端解析 JSON 时栽跟头。今天不讲虚的,直接把我在零点博客做这个工具的底层逻辑和避坑指南分享出来。
一、 环境与目标:我们到底在抓什么?
我们目标抓取的是 EMLOG 博客系统的文章列表。虽然 PHP 后端在 EMLOG 中很常见,但 C# 在处理高并发爬虫和数据处理上依然有优势。
- 前端视角:先看一下 HTML 结构。利用 Chrome 开发者工具,我发现文章列表是通过 AJAX 异步加载的,返回的数据格式是 JSON。
- 后端逻辑:我们需要用 C# 请求接口,拿到 JSON 数据,清洗后存入 MySQL。
二、 正则与 JSON 解析:从乱码到整洁数据
最开始我想直接爬网页源码,结果发现全是乱码。后来发现 EMLOG 的接口返回的是 JSON 格式,这才是正道。
在 C# 中,我们通常使用 System.Text.Json 或第三方库 Newtonsoft.Json。这里有个小技巧:遇到嵌套很深的 JSON,记得用正则表达式 Regex 辅助提取,不要死磕 `JsonPath`,在复杂的 HTML 混合场景下,正则往往更灵活。
// 伪代码示例:简单的正则提取
string htmlContent = client.GetStringAsync(url).Result;
MatchCollection matches = Regex.Matches(htmlContent, "(.*?) ");
foreach (Match m in matches)
{
Console.WriteLine(m.Groups[1].Value); // 获取标题
}
三、 核心避坑:SQL注入防护与预处理语句
这是很多初学者最容易出问题的地方。如果你直接把用户输入拼接到 SQL 语句里,后果不堪设想。哪怕是为了防止数据库被拖库,也必须使用预处理语句。
在 C# 连接 MySQL 时,千万别说:string sql = "SELECT * FROM emlog WHERE title = '" + input + "'";。这是自杀行为。
正确写法:使用参数化查询。
using (MySqlConnection conn = new MySqlConnection(connStr))
{
string sql = "INSERT INTO article (title, content, create_time) VALUES (@title, @content, @time)";
MySqlCommand cmd = new MySqlCommand(sql, conn);
// 使用参数 @title 传值,C# 会自动处理转义,防止 SQL注入
cmd.Parameters.AddWithValue("@title", titleInput);
cmd.Parameters.AddWithValue("@content", contentInput);
cmd.Parameters.AddWithValue("@time", DateTime.Now);
conn.Open();
cmd.ExecuteNonQuery();
}
四、 接口开发与在线工具落地
爬下来的数据不能只存在本地。我们将其封装成一个 RESTful 接口,供前端调用。
前端展示 (HTML/CSS/JS):拿到 JSON 后,用 JavaScript 遍历数组,生成 DOM 节点。在 CSS 中,为了提升零点博客的加载速度,我采用了行内样式与外部 CSS 结合的方式,确保代码整洁。
// JS 处理 JSON
fetch('/api/getArticles')
.then(response => response.json())
.then(data => {
data.forEach(item => {
// 渲染到页面
document.getElementById('article-list').innerHTML += `...`;
});
});
五、 总结与思考
通过这次开发,我深刻体会到安全开发的重要性。无论是做爬虫开发还是常规的后端接口开发,SQL注入防护和预处理语句是底线。同时,正则表达式和 JSON 解析是提升开发效率的利器。
希望大家在开发自己的零点博客或类似项目时,能避开这些坑,写出更健壮的代码。这就是干货的价值所在,也希望零点博客能记录下更多技术人的成长轨迹。



评论一下吧
取消回复