【发布时间】:2016-07-05 20:04:08
【问题描述】:
我有一个系统,我希望人们对具有多个表的多个数据库进行任意选择查询。
我可以通过简单地将查询嵌入到子查询中来“清理”查询,即SELECT * FROM ( $USER_SELECT_QUERY ) 吗?
这将允许用户执行任何类型的 SELECT 查询,但会在任何 INSERT、UPDATE、DELETE、EXEC 等查询上产生语法错误。你能想出任何类型的查询来修改/插入/删除数据,或揭示有关主机系统的其他非预期细节,例如目录列表或其他任何东西吗?
假设:
- 用户可以访问所有附加数据库中的所有数据。
- 对查询时间和资源使用情况进行了适当的配置/监控,以减轻 (D)DOS 攻击。
- (在我的例子中,数据库是只读的 sqlite 文件)
【问题讨论】:
-
为什么不将用户设置为对数据库的只读访问作为安全级别?这似乎是一个不必要的并发症。
-
我的理由是限制允许的陈述范围。
ATTACH可能是 sqlite 中的一个问题,而其他像EXPLAIN和VACUUM这样的“奇怪”语句在某种程度上超出了用户应该被允许做的范围。