【问题标题】:How to restrict sqlite only to execute SELECT statements, and not INSERT, UPDATE如何限制 sqlite 只执行 SELECT 语句,而不是 INSERT、UPDATE
【发布时间】:2011-06-11 03:25:44
【问题描述】:

我有一个报告页面,您可以在其中手动输入查询以获取报告。如何阻止任何 INSERT、UPDATE 或 DELETE 语句,并且只运行 SELECT?

using (var connection = new SQLiteConnection(connectionString))
            {
                var da = new SQLiteDataAdapter
                {
                    SelectCommand = new SQLiteCommand(query, connection)
                };
                try
                {
                    da.Fill(table);
                }

我可以检查查询字符串是否包含“INSERT”、“UPDATE”或“DELETE”,但我认为这不是一个好习惯。

【问题讨论】:

  • 是否有原因无法通过使用只有读取权限的连接来处理?
  • @Sorax - 我认为 sqlite 没有用户和权限。如何创建只读会话?

标签: c# sqlite select


【解决方案1】:

A) 使用只读连接 - 我认为这几乎是最好的解决方案

B) 使用多个 TextBox 作为输入(但这更像是一种解决方案,例如检查字符串是否插入等)

举例

选择 |____|来自 |_________|在哪里 |_______|

编辑:要回答您的评论,只需查看http://www.sqlite.org/c3ref/open.html 尤其是“SQLITE_OPEN_READONLY”主题 - 我现在还没有对 sqlite 做过任何事情,但我认为这应该可以解决问题......

【讨论】:

    【解决方案2】:

    您可以使用@987654321@ 语句将查询分解为VM 指令并检查输出的opcode 列。如果值"OpenWrite" 出现,则查询不是只读的。

    【讨论】:

    • 感谢您的解决方案。我选择了这个,因为可以通过任何其他恶意命令,如 DROP。
    【解决方案3】:

    由于 SQlite 数据库只是一个文件,我猜你可以通过文件系统将数据库设为只读。这当然不是一个花哨的解决方案,而是一个不需要任何代码的解决方案(当然,除非您在无法编写时抛出异常)。

    【讨论】:

    • 它可能需要管理员可以通过 Web 界面写入。如果是这样,那么这将不起作用。
    【解决方案4】:

    事实上,当您尝试使用除了查询变量中的选择之外的数据适配器填充表时,您是否检查过会发生什么?我怀疑你得到了一个空表或数据集,我预计会出现异常,在这种情况下你可以回滚事务。

    无论如何,我都会尝试按照 Sorax 上面的建议将连接创建为只读,实际上我也会解析查询变量。

    【讨论】:

    • 是的,我尝试过使用 INSERT 语句,它在数据库中插入了一行。
    【解决方案5】:

    检查查询字符串不是好习惯吗?相比什么?允许用户在您的报告页面中输入他们想要的任何 SQL 语句?我想不出比这更糟糕的做法了。如果您要允许这种事情,您绝对需要以某种方式限制他们输入的语句类型,并且可能需要 Where 子句(以避免返回数百万行)等。

    【讨论】:

    • 好的做法是在数据库中创建一个只有读取权限的用户。但是,我认为 sqlite 不支持用户/权限,这就是用户提出问题的原因。 OP 所说的不好的做法是尝试猜测用户可能输入的所有可能的恶意内容 - 当您尝试这样做时,您就是在自找麻烦。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2019-03-13
    • 2019-09-14
    • 2015-05-10
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多