3

如果我允许一组用户提交"explain $whatever"到 mysql(通过 Perl 的 DBI 使用DBD::mysql),用户是否可以将任何东西放入 $whatever 中,这会导致任何数据库更改、泄漏重要信息,甚至导致大量数据库负载?如果是这样,怎么做?

我知道通过"explain $whatever"一个人可以弄清楚存在哪些表/列(尽管您必须猜测名称)以及表中有多少条记录,或者有多少条记录具有索引字段的特定值。我不希望人们能够获得有关未索引字段内容的任何信息。

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

但我不是 mysql 专家,我什至不知道 mysql 的某些功能。

在试图提出一个查询计划时,优化器是否会实际执行一个表达式来得出一个索引字段将要与之进行比较的值?

explain select * from atable where class = somefunction(...)

whereatable.class被索引并且不是唯一的并且class='unused'不会找到任何记录但class='common'会找到一百万条记录。可以“解释”评估somefunction(...)吗?然后可以somefunction(...)写成修改数据吗?

4

3 回答 3

6

“解释”可以花费任意长的时间来执行,并使用任意数量的服务器资源,包括在某些事情用尽时导致它崩溃(例如,由于嵌套子查询过多导致的堆栈溢出)。

“解释”可以轻松耗尽临时磁盘空间、服务器地址空间(在 32 位系统上、在 64 位系统上的虚拟内存)或线程堆栈(用于故意恶意构造的查询)。

通常,您根本不能允许完全不受信任的用户提交任何 SQL 的任何部分。即使无法访问单个表,如果他们足够努力,他们仍然可能会导致服务器崩溃。


编辑:更多信息

使用匿名视图/物化子查询的查询通常会在 EXPLAIN 时将整个内部查询执行到临时表中。

所以表格的查询

SELECT * FROM (
  SELECT h1.*, h2.* FROM huge_table h1, huge_table h2) AS rediculous

将永远解释和消耗 tmpdir 中的磁盘空间。

于 2011-01-09T15:34:43.120 回答
3

我能够使用“解释”来获得匹配精确查询的准确行数。所以可以使用

explain select * from user where name='tye' and secret like '%a%'

快速确定任何“秘密”的字母,然后继续确定字母的顺序,最终揭示“秘密”的价值。

于 2011-01-11T07:52:22.270 回答
1

如果您希望用户能够连接到数据库但不能更改它,您应该强制使用用户权限——如果他们只有 SELECT 权限,他们应该无法更改任何内容。

于 2011-01-09T15:30:52.427 回答