C#编程实战:从零构建在线JSON格式化工具,详解MySQL存储与SQL注入防护
大家好,我是零点博客的博主。最近在折腾 EMLOG 系统的二次开发,为了提升博客的实用性,我决定手写一个简单的在线 JSON 格式化工具。这不仅能锻炼我的 C#编程 能力,还能加深对前后端交互的理解。今天就把这个项目的底层逻辑、开发步骤以及踩过的坑都复盘一下,供大家参考。
一、 项目架构与技术栈选型
别看工具小,它其实是一个微型的全栈应用。我们采用经典的 MVC 模式:
- 后端: ASP.NET Core Web API,配合 MySQL 数据库。
- 前端: 原生 HTML/CSS/JS,追求极致加载速度。
- 核心: 处理 JSON 数据解析,以及用户数据的持久化存储。
二、 C# 后端接口开发与 JSON 处理
首先我们需要一个接口来接收前端发送的字符串,然后对其进行格式化返回。在 C# 中,`System.Text.Json` 是处理 JSON 的利器。
[HttpPost("/api/format")]
public IActionResult FormatJson([FromBody] JsonInput input)
{
try
{
// 简单的 JSON 解析验证
var options = new JsonSerializerOptions { WriteIndented = true };
var jsonString = JsonSerializer.Serialize(input.Data, options);
return Ok(new { success = true, result = jsonString });
}
catch (Exception ex)
{
// 记录日志,这里省略
return BadRequest(new { success = false, message = "JSON 格式错误" });
}
}
这段代码展示了 C#编程 中异常处理和 JSON 序列化的基本用法。在实际开发中,我们还需要考虑跨域问题,在 Startup.cs 里配置好 CORS。
三、 前端交互与正则表达式校验
前端部分,我使用原生的 JavaScript 发送 AJAX 请求。为了让用户体验更好,我加了一个简单的正则校验,防止用户发送空字符串或非法字符。
const validateJson = (str) => {
// 简单校验 JSON 字符串格式
try {
if (!str.trim()) throw new Error('内容不能为空');
JSON.parse(str);
return true;
} catch (e) {
return false;
}
};
四、 关键点:MySQL 存储与 SQL 注入防护
光有格式化不够,我还加了一个“保存历史记录”的功能。这就涉及到数据库操作了。很多新手容易忽略安全问题,直接拼 SQL 语句,这是大忌。下面我演示一下正确的SQL注入防护做法。
错误的写法(千万别学):
// 危险!直接拼接用户输入
string sql = "INSERT INTO logs (content) VALUES ('" + userJson + "')";
正确的写法(预处理语句 Parameterized Queries):
string sql = "INSERT INTO logs (user_id, json_content, create_time) VALUES (@uid, @content, @time)";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
// 核心在于使用 @参数名
cmd.Parameters.AddWithValue("@uid", userId);
cmd.Parameters.AddWithValue("@content", userJson);
cmd.Parameters.AddWithValue("@time", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
通过使用预处理语句,数据库引擎会将 SQL 语句和参数分开处理,无论用户输入的 JSON 中包含什么特殊符号,都不会被执行为恶意命令。这是 C#编程 安全开发的基础。
五、 避坑指南与底层拆解
在这次开发中,我也踩了一些坑:
- 字符编码: 保存 JSON 到 MySQL 时,如果服务端配置和数据库编码不一致,会出现乱码。务必统一使用 UTF-8。
- 性能优化: 如果是处理超大的 XML 或 JSON 文件,建议在 C# 后端使用流式处理(Streaming),避免一次性将整个文件加载到内存,防止 OOM(内存溢出)。
- 工具复用: 后续我考虑把这个逻辑封装成一个类库,这样无论是开发 EMLOG 插件还是独立的 Web 工具,都能直接复用。
这次实战让我对 C#编程 的理解更深入了,从简单的接口调用到数据库安全交互,每一个环节都很重要。如果你在开发中也遇到类似问题,欢迎在零点博客留言交流,我们一起进步!



评论一下吧
取消回复