实战复盘:基于 C# 在 EMLOG 中开发 SQL 防护工具,附完整代码案例
大家好,我是零点博客的博主。最近在给站点做安全加固时发现,单纯的插件拦截往往不够用,特别是处理 EMLOG 的评论或登录接口时,总得手写逻辑。于是我就想着利用 C# 的强类型特性,在后台写一个轻量级的 SQL 防护在线工具,专门用来校验恶意输入。
一、 开发背景与需求
我们在开发 C# 后端时,通常直接拼接 SQL 字符串,但如果不处理,很容易被注入。这次结合 EMLOG 的数据结构,我们需要实现三个核心功能:
1. 接收前端 JSON 数据。
2. 后端使用 MySQL 预处理语句防注入。
3. 前端配合正则表达式做初步清洗。
二、 后端 C# 逻辑:预处理与 SQL 防护
很多新手容易忽略“防注入”的本质。下面我直接分享一个在后台运行的 代码案例,核心在于使用 SqlParameter。
using System.Data;
using MySql.Data.MySqlClient;
public static string SafeSqlQuery(string userInput)
{
string connStr = "Server=localhost;Database=emlog;User=root;Password=123456;";
string sql = "SELECT * FROM emlog_comment WHERE content LIKE @input";
// 关键步骤:使用参数化查询,杜绝 SQL 注入
using (MySqlConnection conn = new MySqlConnection(connStr))
{
using (MySqlCommand cmd = new MySqlCommand(sql, conn))
{
// 将变量转为参数,数据库驱动会自动处理转义
cmd.Parameters.Add("@input", MySqlDbType.VarChar).Value = $"%{userInput}%";
conn.Open();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
return reader.HasRows ? "Check Pass" : "Not Found";
}
}
}
}
这段代码展示了底层逻辑:无论前端传进来什么(哪怕是 '; DROP TABLE emlog--),到了数据库里它只是一个字符串,不再是执行命令的代码。
三、 前端实现:HTML/CSS/JS 与正则实战
光有后端不够,前端也需要给用户友好的提示。下面这个 HTML 模板结合了 CSS 样式和 JS 逻辑。
<div class="tool-box">
<input type="text" id="sqlInput" placeholder="请输入待检测的 SQL 字符串" />
<button onclick="checkSQL()">执行检测</button>
</div>
<div id="result" style="color: red;"></div>
function checkSQL() {
var input = document.getElementById('sqlInput').value;
// 正则表达式:匹配常见的 SQL 注入特征
// 1. 括号 '()' 2. 分号 ';' 3. ' OR ' 或 ' AND '
var regex = /((|)|;|'|'|\s+OR\s+|\s+AND\s+)/i;
if (regex.test(input)) {
document.getElementById('result').innerText = "警告:检测到潜在 SQL 注入字符!";
return false;
}
// 如果没有正则匹配,则发送 AJAX 请求给后端 C# 处理
// ... AJAX 代码省略 ...
document.getElementById('result').innerText = "无风险,等待后端验证。";
return true;
}
四、 零点博客的避坑指南
在整合这些功能时,有几个细节必须注意:
- JSON 解析易错点: 如果 C# 后端接收 JSON 时没有指定
Newtonsoft.Json或System.Text.Json的引用,很容易序列化失败,导致前端收到 null。务必检查请求头Content-Type: application/json。 - 跨域问题: 前端如果跑在另一个端口,C# 的
[EnableCors]特性一定要加上,否则必报错。 - EMLOG 生态: PHP 和 C# 混合开发时,要注意时区问题。PHP 的
date_default_timezone_set和 C# 的DateTime.Now必须保持一致,否则记录日志的时间差会有几个小时之差。
希望这个基于 C# 与正则实战的 代码案例 能帮大家在 EMLOG 开发中少踩坑。如果你有更多关于爬虫或接口开发的需求,欢迎在评论区交流!



评论一下吧
取消回复