我有一个系统,希望人们对具有多个表的多个数据库进行任意选择查询。
我可以通过简单地将查询嵌入到子查询(即SELECT * FROM ( $USER_SELECT_QUERY )
)中来“清理”查询吗?
这将允许用户执行任何类型的SELECT查询,但将对任何INSERT
,UPDATE
,DELETE
,EXEC
等查询产生语法错误。您能否提出某种会修改/插入/删除数据的查询,或揭示有关主机系统的其他意外细节,例如目录列表或其他内容?
假设:
用户可以访问所有附加数据库中的所有数据。
适当配置/监视查询时间和资源使用情况以缓解(D)DOS攻击。
(在我的情况下,数据库是只读的sqlite文件)
另请注意,我完全了解允许用户执行任意SQL的一般危险,因此我想强调一点,我非常特别地询问使用select子查询清理查询的限制。
最佳答案
要防止大多数此类语句,请使用authorization callback。
您也可以使用sqlite3_stmt_readonly()防止任何写操作。
您应该确保没有任何危险的用户定义函数或虚拟表,并且禁用了load_extension()或fts3_tokenizer()之类的功能。
关于sql - 使用内部SELECT查询“清理”任意SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201313/