sql - 使用内部SELECT查询“清理”任意SQL?

标签 sql sqlite

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

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

这将允许用户执行任何类型的SELECT查询,但将对任何INSERTUPDATEDELETEEXEC等查询产生语法错误。您能否提出某种会修改/插入/删除数据的查询,或揭示有关主机系统的其他意外细节,例如目录列表或其他内容?

假设:


用户可以访问所有附加数据库中的所有数据。
适当配置/监视查询时间和资源使用情况以缓解(D)DOS攻击。
(在我的情况下,数据库是只读的sqlite文件)


另请注意,我完全了解允许用户执行任意SQL的一般危险,因此我想强调一点,我非常特别地询问使用select子查询清理查询的限制。

最佳答案

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

您也可以使用sqlite3_stmt_readonly()防止任何写操作。

您应该确保没有任何危险的用户定义函数或虚拟表,并且禁用了load_extension()fts3_tokenizer()之类的功能。

关于sql - 使用内部SELECT查询“清理”任意SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38201313/

相关文章:

python - 增加一个值,但不超过另一个值sql

c++ - 无法安装和定位 libsqlite3.a

mysql - 如何根据日期从两个表SQL中提取数据

c# - SQLiteConnection DisposedObject

mysql - SQL交叉删除行

MySQL:组函数的使用无效

c++ - cpp - sqlite3 如何正确绑定(bind) `char` 类型并从数据库中读取它

c# - 参数 "Version 3"的 ConnectionString 格式无效

sql - 甲骨文朱利安一天

sql - 具有 session 变量的 postgresql 行级安全性