实战复盘:用 C# 在 EMLOG 上开发在线工具站,含爬虫与 SQL 防注入指南

最近在零点博客折腾的一个新项目——在线工具开发,终于上线了。作为技术博主,我深知写博客容易,但把博客里的 C# 代码真正做成能用的 Web 工具并不容易。这次我直接抛弃了传统的表单提交,而是基于 EMLOG 博客系统的底层,结合 C# 后端逻辑、前端 JS 交互以及 MySQL 数据库做了一个轻量级的数据处理工具。

很多人问我,为什么不用现成的框架,非要折腾 C# 和 EMLOG?其实我是想通过这次实操,给大家展示一套完整的全栈开发思路,包括HTML/CSS/JSJSON/XML 解析爬虫获取数据,以及最关键的——SQL 注入防护

一、 项目架构与前期准备

这次开发的核心是“在线工具开发”。我的工具需求很简单:用户上传一段包含 HTML 标签的文本,后端解析出纯文本,并利用爬虫抓取的特定关键词进行标红处理。

技术栈组合:
- 博客内核:EMLOG(支持 C# 和 PHP 双后端);
- 后端开发:C#(用于复杂的数据清洗逻辑);
- 前端交互:原生 HTML/CSS/JS(保证轻量级,不依赖庞大前端库);
- 数据存储:MySQL。

二、 前端:JS 获取文件并序列化

前端部分其实很简单,为了演示数据流,我写了一个简单的 JS 函数来读取用户上传的文本文件。

function handleFileSelect(event) {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = function(e) {
const textContent = e.target.result;
// 直接发送给 C# 后端处理
processData(textContent);
};
reader.readAsText(file);
}

这里用到了 JS 的 FileReader API,配合 JSON 的序列化与反序列化,确保数据能安全地从前端传到后端。

三、 后端:C# 处理逻辑与正则表达式

拿到前端传来的 JSON 字符串后,C# 后端就开始工作了。这里涉及到大量的字符串操作和正则表达式匹配。

我们的需求是提取 HTML 标签内的内容。我写了一个正则去除了所有标签:

string pattern = @"<(.|\n)+?";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
string result = regex.Replace(inputString, string.Empty);

拿到纯文本后,为了丰富工具的趣味性,我并没有直接显示,而是做了一个爬虫开发的小联动。我写了一个简单的 HTTP 请求逻辑,模拟爬取某个公开的 API 接口,把返回的 JSON 数据解析出来,作为工具的“参考词典”。

using (HttpClient client = new HttpClient())
{
var response = await client.GetStringAsync("https://api.example.com/data");
var data = JObject.Parse(response);
// 将数据存入 MySQL 以供后续查询
}

四、 底层拆解:SQL 注入防护与预处理

这可能是本次开发最核心、也是最容易出问题的地方。很多新手做工具站时,喜欢直接拼接 SQL 语句,这在爬虫开发或者用户数据量大时,简直是给自己埋雷。

我的方案是使用 C# 的 SqlCommand 配合 参数化查询(预处理语句)。下面看一段代码,大家对比一下区别:

// ❌ 危险:直接拼接字符串
string sql = "INSERT INTO tools (content, create_time) VALUES ('" + userInput + "', NOW())";
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
// ✅ 安全:使用预处理语句
string sql = "INSERT INTO tools (content, create_time) VALUES (@content, @time)";
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@content", userInput); // 即使 input 包含 ' 或 -- 也不会破坏 SQL 结构
cmd.Parameters.AddWithValue("@time", DateTime.Now);
cmd.ExecuteNonQuery();

通过这种方式,无论用户在输入框里输入什么(哪怕是 SQL 注入攻击脚本),C# 引擎都会把它当作普通的文本字符串处理,而不是可执行的代码。这才是SQL 注入防护的真正含义。

五、 数据库:MySQL 交互与 JSON 存储

处理完所有数据后,我选择了将处理结果存回 MySQL。为了方便后续调用,我在数据库字段中直接存入 JSON 字符串,而不是拆分成多个字段。

// 使用 MySqlCommand 执行存储过程或 SQL 语句
string insertSql = "INSERT INTO tool_results (user_input, processed_json) VALUES (@input, @json)";
// ... 执行逻辑 ...

六、 避坑指南与总结

这套流程跑通后,我踩了几个坑,在这里分享给各位:

  1. 字符编码问题: 在 C# 读取文件或从 MySQL 读取时,记得统一使用 UTF-8,否则中文会乱码。
  2. 正则性能: 如果是处理超长文本,正则匹配会比较耗资源,建议限制上传文件的大小。
  3. 接口跨域: 如果你使用 PHP 做中转代理,记得在后端处理 CORS 跨域问题,否则前端 JS 调用会报错。

总的来说,这次在线工具开发的经历让我对 C# 后端有了更深的理解。对于想做工具站的博主来说,在 EMLOG 上折腾并不难,难的是在数据安全和代码规范上下功夫。希望这篇实战复盘能帮到大家,如果你也有类似的代码难题,欢迎在零点博客留言讨论!