Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中,“解释…”总是安全的吗?_Sql_Mysql_Perl_Dbi_Explain - Fatal编程技术网

在mysql中,“解释…”总是安全的吗?

在mysql中,“解释…”总是安全的吗?,sql,mysql,perl,dbi,explain,Sql,Mysql,Perl,Dbi,Explain,如果我允许一组用户使用DBD::mysql通过Perl的DBI向mysql提交explain$whater,那么用户是否可以将任何内容放入$whater中,从而进行任何数据库更改、泄漏非琐碎信息,甚至导致大量数据库负载?如果是,怎么做 我知道,通过explain$,无论你能找出存在哪些表/列,你都必须猜测名称,以及一个表中大概有多少条记录,或者有多少条记录具有索引字段的特定值。我不希望人们能够获得任何关于未索引字段内容的信息 mysql不应该允许多个语句,所以我不希望运行任何查询,只解释一个查询

如果我允许一组用户使用DBD::mysql通过Perl的DBI向mysql提交explain$whater,那么用户是否可以将任何内容放入$whater中,从而进行任何数据库更改、泄漏非琐碎信息,甚至导致大量数据库负载?如果是,怎么做

我知道,通过explain$,无论你能找出存在哪些表/列,你都必须猜测名称,以及一个表中大概有多少条记录,或者有多少条记录具有索引字段的特定值。我不希望人们能够获得任何关于未索引字段内容的信息

mysql不应该允许多个语句,所以我不希望运行任何查询,只解释一个查询。即使是子查询也不应该执行,只是解释一下

但我不是mysql专家,mysql肯定有一些我甚至不知道的特性

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

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

其中,atable.class被索引且不唯一,class='unused'将找不到任何记录,但class='common'将找到一百万条记录。可能“解释”评估某个函数。。。?然后能有什么功能。。。写入时,它会修改数据?

如果您希望用户能够连接到数据库,但不更改数据库,则应使用用户权限强制执行此操作-如果他们只有选择权限,则不应更改任何内容。

解释可能需要任意长的时间执行,并使用任意数量的服务器资源,包括在某些内容耗尽时导致服务器崩溃,例如,由太多嵌套子查询导致的堆栈溢出

Explain可以很容易地耗尽临时磁盘空间、32位系统上的服务器地址空间、64位系统上的虚拟内存或故意构造查询的线程堆栈

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

编辑:更多信息

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

所以对表单的查询

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

解释和消耗tmpdir中的磁盘空间将花费很长时间。

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

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

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

可能是安全的,但无论如何我不会这么做;任何有理由玩弄explain的人都应该得到DB和mysql CLI的测试副本。任何不需要测试数据库的人都应该避免编写查询,因此不需要解释;你能提供更多的信息吗?什么样的解释可能会花费任意长的时间或耗尽临时磁盘空间或内存?谢谢。这是一个很好的见解。这听起来像是在解释之后限制文本的总大小一样简单。至少,我不能想出一个复杂度越来越高的SQL查询来解释!甚至在**2和查询文本的长度之间。听起来这也可以用来泄漏数据-构造一个子查询,以返回的项数的形式显示信息。@b即使对于快速解释(例如普通jointhanks),bdonian explain也会给出大致的行数。这是很好的建议。添加一个只读用户并在执行解释时使用该用户完全消除了人们通过解释了解如何进行更新的主要风险。权限系统将阻止人们更改数据,但不会使服务器崩溃或导致拒绝服务,请参阅我的答案。