【发布时间】:2022-10-22 06:35:46
【问题描述】:
使用 SQLite 我遇到了 SQL 注入漏洞。如何解决?
string query = "SELECT * FROM " + tablename;
using (var transaction = conn.BeginTransaction())
{
var sqliteadapter = new SQLiteDataAdapter(query, conn);
var sqlcmdbuilder = new SQLiteCommandBuilder(sqliteadapter);
sqliteadapter.Update(data);
transaction.Commit();
}
sqliteadapter.Update(data); 是有 SQL 注入问题的行。 data 是表和字段信息的数据表。
【问题讨论】:
-
由于您使用字符串连接来构建 SQL 语句,因此会出现 SQL 注入的可能性。在这种情况下,您无能为力,因为您不能使用参数来指定表。
tablename变量究竟是如何设置的?如果它是用户输入的自由格式文本,那么您需要在使用前对其进行验证。如果它是从已知的良好表名列表中选择的,则没有问题,但应在代码中添加一条解释说明的注释。 -
如果它是用户输入的自由格式文本,我们如何验证它?
-
这是一个潜在的问题,因为用户可以输入任何内容,因此恶意用户可以制作一些部分 SQL,这些 SQL 将破坏或删除您的整个数据库。您需要验证输入。一个简单的选项可能是检查输入是否只包含字母,假设您只在表名中使用字母。更好的选择是查询数据库中所有有效的表名,并确保输入等于其中之一。
-
也就是说,为什么用户要提供数据库表名?如果这是一个数据库管理应用程序,那么这是有道理的,但是,否则,用户通常甚至不应该知道数据库表名是什么,甚至根本不需要知道有一个数据库。
-
你是对的,但是用户提供了输入,即表名,我们提取和管理数据。正如你所说,我将验证表格字段并检查问题是否仍然存在。
标签: c# sql sqlite sql-injection