在mysql中,"解释......"总是安全吗?

tye*_*tye 3 mysql sql perl dbi explain

如果我允许一组用户提交"explain $whatever"到mysql(通过Perl的DBI使用DBD::mysql),用户可以将任何内容放入任何数据库更改,泄漏非平凡信息,甚至导致大量数据库负载吗?如果是这样,怎么样?

我知道,通过"explain $whatever"一个可以找出表/存在的列(你要的名字,虽然)和大约多少条记录在一个表或多少记录有一个索引字段中的特定值.我不希望人们能够获得有关未索引字段内容的任何信息.

DBD::mysql不应该允许多个语句,所以我不希望它可以运行任何查询(只解释一个查询).只是解释,即使子查询也不应该被执行.

但我不是一个mysql专家,肯定有mysql的功能,我甚至都不知道.

在尝试提出查询计划时,优化器可能会实际执行一个表达式,以便提出索引字段将要与之进行比较的值吗?

explain select * from atable where class = somefunction(...)
Run Code Online (Sandbox Code Playgroud)

哪里atable.class是索引而不是唯一的,并且没有class='unused'找到记录但class='common'会找到一百万条记录.可能'解释'评估somefunction(...)?然后可以somefunction(...)编写这样修改数据?

Mar*_*rkR 6

"Explain"可能需要任意长的时间来执行,并使用任意数量的服务器资源,包括在某些事情耗尽时导致崩溃(例如,由于嵌套子查询太多而导致堆栈溢出).

"解释"很容易耗尽临时磁盘空间,服务器地址空间(在32位系统上,64位系统上的虚拟内存)或线程堆栈(故意恶意构建的查询).

通常,您不能允许完全不受信任的用户提交任何SQL的任何部分.即使没有访问单个表,如果他们努力尝试,他们仍然可能会崩溃服务器.


编辑:进一步的信息

使用匿名视图/具体化子查询的查询通常在EXPLAIN上执行整个内部查询到临时表中.

所以对表单的查询

SELECT * FROM (
  SELECT h1.*, h2.* FROM huge_table h1, huge_table h2) AS rediculous
Run Code Online (Sandbox Code Playgroud)

将永远解释并消耗tmpdir中的磁盘空间.