You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite中动态插入数据并防范SQL注入?

如何安全插入数据到SQLite并避免SQL注入

你的代码里直接拼接用户输入到SQL语句的写法存在严重的SQL注入风险——比如用户输入带单引号的内容就会破坏SQL结构,甚至被恶意利用篡改数据库。必须改用参数化查询来彻底解决这个问题,同时我还调整了几个细节让代码更规范安全:

  1. 把ModelState有效性检查提前,避免无效数据进入数据库操作流程
  2. 使用参数化SQL语句,用@参数名作为占位符,代替直接拼接变量
  3. 通过SQLiteCommand.Parameters.Add绑定参数值,让数据库自动处理参数的转义
  4. 移除手动调用conn.Close(),因为using语句会自动释放连接资源
  5. 额外提醒:密码不要明文存储,应该用哈希算法(比如BCrypt)处理后再存入数据库

修改后的完整代码:

public class Data
{
    public string user { get; set; }
    public string password { get; set; }
    public string repeatPass { get; set; }
}

[HttpPost, AllowCrossSite]
[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]
[Route("api/Register/Posthdf")]
public IHttpActionResult Posthdf(Data data)        
{
    // 先检查数据有效性,无效直接返回
    if (!ModelState.IsValid)
        return BadRequest("Invalid data");        

    using (SQLiteConnection conn = new SQLiteConnection("Data Source=C:\\ProiectVisualStudio\\Reporting_how-to-use-the-web-report-designer-in-javascript-with-angular-t566422-19.2.3-\\CS\\ServerSide\\App_Data\\RegisterDB.db; Version = 3; New = True; Compress = True; "))
    {
        using (SQLiteCommand cmd = new SQLiteCommand())
        {
            try
            {
                cmd.Connection = conn;
                conn.Open();
                // 使用参数化SQL语句,用@占位符
                string strSql = "INSERT INTO tbl_Users (User, Password, RepeatPassword) VALUES(@User, @Password, @RepeatPassword);";
                cmd.CommandText = strSql;
                // 添加并绑定参数
                cmd.Parameters.AddWithValue("@User", data.user);
                // 注意:实际项目中这里应该用哈希后的密码,比如BCrypt.HashPassword(data.password)
                cmd.Parameters.AddWithValue("@Password", data.password);
                cmd.Parameters.AddWithValue("@RepeatPassword", data.repeatPass);
                
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("***Error connection DB: " + ex + "/n");
                // 可以在这里返回错误响应,比如 return InternalServerError(ex);
            }
            // using块结束会自动关闭连接,不需要手动Close
        }
    }

    return Ok(true);        
}

参数化查询的核心原理是让数据库把SQL语句结构和参数值分开处理,不会把用户输入当成SQL语句的一部分执行,从根源上杜绝了SQL注入的可能。

内容的提问来源于stack exchange,提问作者Ionut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:10:53