C# 后端开发实战:在零点博客中构建带正则校验的 SQL 注入防护工具
大家好,我是零点博客的站长。最近在做 后端开发 时,为了提升站点的安全性,我琢磨着写一个在线 SQL 注入检测工具,顺便把之前学到的正则表达式和 MySQL 预处理语句串联起来做个复盘。今天就把这个实操教程和源码案例分享给各位,不讲虚的,全是干货。
一、 需求背景与技术选型
在做 EMLOG 或其他 PHP/C# 驱动网站的时,数据库安全是重中之重。零点博客决定引入一个后端服务,用于在用户提交数据前,通过正则快速拦截常见的恶意攻击模式。
- 后端语言: C# (ASP.NET Core)
- 数据库: MySQL
- 核心功能: 接口开发、数据清洗、JSON 数据解析与返回
二、 底层逻辑:正则与预处理
很多人问我,为什么有了预处理语句还要用正则?这里有个误区。正则其实是第一道防线,用于过滤掉明显带有恶意特征的字符(如 `' or 1=1`)。而预处理语句是最后的安全网。
1. 核心代码解析
下面这段代码是后端开发的核心逻辑,可以看到我如何通过 C# 操作 MySQL。
// 引入必要的命名空间
using System.Data;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
using Newtonsoft.Json; // 用于 JSON 序列化
public IActionResult CheckInjection(string userInput)
{
// 1. 正则表达式防御:检测关键词
// 这里简单列举几个常见的 SQL 注入特征词
string pattern = @"\b(union|select|insert|update|delete|drop|xp_cmdshell)\b"i;
bool hasMalicious = Regex.IsMatch(userInput, pattern);
if (hasMalicious)
{
// 返回 JSON 格式的错误信息
var result = new { status = "error", message = "检测到非法 SQL 关键字符!", data = null };
return Content(JsonConvert.SerializeObject(result), "application/json");
}
// 2. 如果正则放行,使用预处理语句执行查询(实际场景中这里可能是保存数据)
string connectionString = "Server=localhost;Database=zeropoint;User Id=root;Password=123;";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
string sql = "SELECT id, title FROM articles WHERE content LIKE @keyword";
// 关键点:使用 @keyword 参数,而不是直接拼接字符串
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@keyword", "%" + userInput + "%");
DataTable dt = new DataTable();
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
{
sda.Fill(dt);
}
// 返回 JSON 数据给前端
return Content(JsonConvert.SerializeObject(new { status = "ok", data = dt.Rows }), "application/json");
}
}
}
三、 前端与爬虫视角的互动
这个工具不仅是给人用的,偶尔也需要爬虫去定期检测一下第三方网页是否存在漏洞。在前端开发方面,我使用了原生 HTML/CSS/JS 做了一个极简的输入框,监听 `oninput` 事件,一旦输入违规字符,通过 AJAX 调用上述接口。
通过 接口开发,我们实现了前后端分离,避免了 SQL 注入风险,也保证了数据传输格式的一致性。
四、 避坑指南与实战复盘
在开发过程中,我踩了不少坑,这里总结一下:
- 正则写法太宽泛: 起初我直接搜 "OR 1=1",结果把正常的关键词也屏蔽了,用户体验极差。后来改成了精确匹配特定关键字,效率反而更高。
- SQL 注入防护的误区: 即使加了预处理,如果前端的 HTML 没做好转义(XSS),依然会有风险。我在工具中加了一个 CSS 脚本,自动过滤所有 `



评论一下吧
取消回复