实战复盘:基于 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 开发中少踩坑。如果你有更多关于爬虫或接口开发的需求,欢迎在评论区交流!