如果我允许一组用户提交 "explain $whatever"
到 mysql(通过使用 DBD::mysql
的 Perl 的 DBI),是否有任何用户可以可以放入 $whatever 会导致任何数据库更改,泄漏重要信息,甚至导致显着的数据库负载?如果是,怎么办?
我知道通过 "explain $whatever"
可以找出存在哪些表/列(不过您必须猜测名称)以及大概有多少条记录在表中或有多少记录具有索引字段的特定值。我不希望人们能够获得有关未索引字段内容的任何信息。
DBD::mysql
不应允许多个语句,因此我不希望它可以运行任何查询(仅解释一个查询)。甚至不应该执行子查询,只是解释一下。
但我不是 mysql 专家,肯定有一些我什至不知道的 mysql 功能。
在尝试制定查询计划时,优化器可能会实际执行一个表达式以得出要与索引字段进行比较的值吗?
explain select * from atable where class = somefunction(...)
其中 atable.class
被索引并且不是唯一的并且 class='unused'
将找不到任何记录但 class='common'
会找到一百万条记录。可以“解释”评估 somefunction(...)
吗?然后可以编写 somefunction(...)
修改数据吗?
最佳答案
“解释”可以执行任意长的时间,并使用任意数量的服务器资源,包括如果某些事情用尽(例如,由太多嵌套子查询导致的堆栈溢出)导致崩溃。
“解释”很容易耗尽临时磁盘空间、服务器地址空间(在 32 位系统上,在 64 位系统上虚拟内存)或线程堆栈(对于故意恶意构造的查询)。
一般来说,您根本不能允许完全不受信任的用户提交任何 SQL 的任何部分。即使无法访问单个表,如果他们足够努力,他们仍然可能使服务器崩溃。
编辑:更多信息
使用匿名 View /物化子查询的查询,通常会在 EXPLAIN 上执行整个内部查询到一个临时表中。
So 形式的查询
SELECT * FROM (
SELECT h1.*, h2.* FROM huge_table h1, huge_table h2) AS rediculous
将永远解释并消耗 tmpdir 中的磁盘空间。
关于sql - 在mysql中, "explain ..."总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4638375/