前言:零点博客的建站心路

最近在零点博客折腾EMLOG二次开发时,遇到一个棘手的问题:需要让用户输入特定的关键词去后台数据库查询。起初我只想着在C#后端直接拼SQL语句,结果被“资深”前辈一顿数落,说这种写法早过时了,存在严重的SQL注入风险。

作为一名追求极致的博主,我决定彻底搞懂JavascriptC#MySQL交互的最佳实践。今天就把这段真实的踩坑复盘分享出来,干货满满,建议收藏。

第一步:Javascript前端拦截与正则清洗

虽然后端再安全,用户体验也不能差。如果在用户输入错误时直接刷新页面报错,体验太差。我们可以在前端用Javascript配合正则表达式先进行“预检”。

比如,我们要校验用户输入的用户名必须包含字母和数字:

function validateInput() {
  const username = document.getElementById('username').value;
  // 正则匹配:6-16位,包含字母和数字
  const reg = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,16}$/;
  if (!reg.test(username)) {
    alert('用户名格式不对,请重新输入!');
    return false;
  }
  // 通过验证,转为JSON发送给C#后端
  fetch('/api/query', {
    method: 'POST',
    body: JSON.stringify({ key: username })
  });
}

第二步:C#后端严谨的预处理语句(防注入核心)

前端验证了还不够,因为用户可以通过抓包绕过前端。真正的安全壁垒在C#后端。千万不要写string sql = "SELECT * FROM " + tableName; 这种拼接语句。

我们要使用预处理语句。在C#中连接MySQL,推荐使用MySql.Data驱动:

public string SafeQuery(string username)
{
  using (MySqlConnection conn = new MySqlConnection(connectionString))
  {
    conn.Open();
    // 使用参数化查询,?号是占位符
    string sql = "SELECT id, content FROM blog_articles WHERE title LIKE ?keyword";
    MySqlCommand cmd = new MySqlCommand(sql, conn);
    // 添加参数,防止注入
    cmd.Parameters.AddWithValue("?keyword", "%" + username + "%");
    MySqlDataReader reader = cmd.ExecuteReader();
    
    // 将查询结果转为JSON返回给前端
    List<dynamic> result = new List<dynamic>();
    while (reader.Read())
    {
      result.Add(new { id = reader["id"], content = reader["content"] });
    }
    return JsonConvert.SerializeObject(result);
  }
}

第三步:JSON数据的解析与接口开发

后端返回的JSON字符串,Javascript可以轻松解析。这样我们就完成了一个“前端验证+后端防护+数据交互”的完整闭环。

这套方案不仅应用在EMLOG开发中,同样适用于C# PHP等后端框架。掌握正则表达式与SQL预处理,是每个建站开发者的必修课。

如果你在实操中遇到问题,欢迎在零点博客留言,我们一起交流避坑!