3

ユーザーのグループが"explain $whatever"(PerlのDBIを使用してDBD::mysql)mysqlに送信することを許可した場合、データベースを変更したり、重要な情報を漏らしたり、データベースに大きな負荷をかけたりする可能性のあるものは何でも$に入れることができますか?もしそうなら、どのように?

私は、"explain $whatever"1つで、どのテーブル/列が存在するか(ただし、名前を推測する必要があります)、テーブルに含まれるレコードの数、またはインデックス付きフィールドに特定の値を持つレコードの数を把握できることを知っています。インデックス付けされていないフィールドの内容に関する情報を取得できるとは思いません。

DBD::mysql複数のステートメントを許可するべきではないので、クエリを実行できるとは思わない(1つのクエリを説明するだけ)。説明しただけで、サブクエリでさえ実行すべきではありません。

しかし、私はmysqlの専門家ではなく、確かに私が気付いていないmysqlの機能があります。

クエリプランを考え出す際に、オプティマイザは実際に式を実行して、インデックス付きフィールドが比較される値を考え出すことができますか?

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

ここで、atable.classはインデックス付けされており、一意でclass='unused'はなく、レコードは見つかりませんがclass='common'、100万件のレコードが見つかります。「説明」は評価するかもしれsomefunction(...)ませんか?そして、それがsomefunction(...)データを変更するように書くことができますか?

4

3 に答える 3

6

「Explain」の実行には任意の時間がかかり、任意の量のサーバーリソースを使用する可能性があります。たとえば、ネストされたサブクエリが多すぎるためにスタックオーバーフローが発生した場合に、サーバーリソースがクラッシュする可能性があります。

「Explain」は、一時ディスクスペース、サーバーアドレススペース(32ビットシステムの場合)、またはスレッドスタック(意図的に悪意を持って作成されたクエリの場合)を簡単に使い果たす可能性があります。

一般に、完全に信頼できないユーザーが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'を使用して、正確なクエリに一致する行の正確な数を取得することができました。だから1つを使用することができます

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 に答える