如何在SQLite中动态插入数据并防范SQL注入?
如何安全插入数据到SQLite并避免SQL注入
你的代码里直接拼接用户输入到SQL语句的写法存在严重的SQL注入风险——比如用户输入带单引号的内容就会破坏SQL结构,甚至被恶意利用篡改数据库。必须改用参数化查询来彻底解决这个问题,同时我还调整了几个细节让代码更规范安全:
- 把ModelState有效性检查提前,避免无效数据进入数据库操作流程
- 使用参数化SQL语句,用
@参数名作为占位符,代替直接拼接变量 - 通过
SQLiteCommand.Parameters.Add绑定参数值,让数据库自动处理参数的转义 - 移除手动调用
conn.Close(),因为using语句会自动释放连接资源 - 额外提醒:密码不要明文存储,应该用哈希算法(比如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
相关产品推荐
相关产品推荐

