如果我允许一组用户将"explain $whatever"
提交给mysql(通过Perl的DBI使用DBD::mysql
),是否有任何用户可以将任何数据库更改,泄漏不重要的信息,甚至导致重大数据库负载?如果是这样,怎么样?在mysql中,“解释...”总是安全吗?
我知道,通过"explain $whatever"
一个可以找出表/列存在什么(你必须猜测的名字,虽然)和大约多少条记录在一个表或多少记录有一个索引字段中的特定值。我不希望一个人能够获得有关未索引字段内容的任何信息。
DBD::mysql
不应该允许多个语句,所以我不期望它有可能运行任何查询(只是解释一个查询)。即使子查询不应该执行,只是解释。
但我不是一个mysql专家,并且肯定有我甚至没有意识到的mysql特性。
在试图提出一个查询计划时,优化程序可能会真正执行一个表达式,以便拿出索引字段将与之进行比较的值。
explain select * from atable where class = somefunction(...)
其中atable.class
被索引,而不是唯一的,class='unused'
会发现没有任何记录,但class='common'
会发现一百万条记录。可能'解释'评估somefunction(...)
?然后可以编写somefunction(...)
以修改数据吗?
可能它是安全的,但我不会这样做;)任何有理由与`explain`混淆的人应该被给予DB和mysql CLI的测试副本。任何不需要测试数据库的人都应该从写入查询中保存,因此不需要`explain`;) – hobbs 2011-01-09 08:55:11