【问题标题】:"Sanitizing" arbitrary SQL using inner SELECT queries?使用内部 SELECT 查询“清理”任意 SQL?
【发布时间】:2016-07-05 20:04:08
【问题描述】:

我有一个系统,我希望人们对具有多个表的多个数据库进行任意选择查询。

我可以通过简单地将查询嵌入到子查询中来“清理”查询,即SELECT * FROM ( $USER_SELECT_QUERY ) 吗?

这将允许用户执行任何类型的 SELECT 查询,但会在任何 INSERTUPDATEDELETEEXEC 等查询上产生语法错误。你能想出任何类型的查询来修改/插入/删除数据,或揭示有关主机系统的其他非预期细节,例如目录列表或其他任何东西吗?

假设:

  • 用户可以访问所有附加数据库中的所有数据。
  • 对查询时间和资源使用情况进行了适当的配置/监控,以减轻 (D)DOS 攻击。
  • (在我的例子中,数据库是只读的 sqlite 文件)

【问题讨论】:

  • 为什么不将用户设置为对数据库的只读访问作为安全级别?这似乎是一个不必要的并发症。
  • 我的理由是限制允许的陈述范围。 ATTACH 可能是 sqlite 中的一个问题,而其他像 EXPLAINVACUUM 这样的“奇怪”语句在某种程度上超出了用户应该被允许做的范围。

标签: sql sqlite


【解决方案1】:

要阻止大多数此类语句,请使用authorization callback

您也可以使用sqlite3_stmt_readonly() 来阻止任何写入。

您应该确保您没有任何危险的用户定义函数或虚拟表,并且像 load_extension()fts3_tokenizer() 这样的函数被禁用。

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多