2016-05-07 5 views
1
mysql> select * from users where id=0; 
Empty set (0.00 sec) 

mysql> select * from users where id=0 and sleep(5); 
Empty set (0.00 sec) 

mysql> select * from users where id=0 and benchmark(1000000,sha1(1)); 
Empty set (0.39 sec) 

mysql> select * from users where id=0 xor sleep(5); 
Empty set (1 min 5.02 sec) 

id = 0の場合、ユーザーは存在しません。 2番目のクエリが5秒間スリープ状態にならないのはなぜですか? benchmark(1000000,sha1(1))またはxor sleep(5)を使用すると、なぜスリープ状態になるのですか?最初のresutlがfalseの場合、mysql sleepは動作しません。

ありがとうございました。

答えて

0

これは「ショートサーキット」と呼ばれ、ほぼすべてのデータベースとほぼすべてのプログラミング言語の機能とみなされます。

実行する必要のないロジックは実行されません。それはsleep()とは関係ありません。エンジンがすでに答えを知っているときには、コードの実行をやめるほうが簡単です。

私はsleep()を強制的に1回のクエリで実行することをお勧めします。 SQLクエリはではなく、手順的であることを目的としたです。それらは結果セットを記述し、クエリエンジンは適切なコードを生成します。 sleep()はSQLの結果セットの対象外です。

sleep()が本当に必要な場合は、スクリプトで別の手順を実行することをお勧めします。

+0

ありがとう、私はSQL注入をテストしている、睡眠時間の結果は私を混乱させる。 'select * from id = 0そして(select * from(select sleep(5))x)'、なぜこのクエリは5秒間スリープ状態になるのですか?エンジンはすでに答えを知っているはずです。 – user1773219

+1

いいえ、そうではありません。 '(SELECT * FROM(SELECT ...)'を使用すると、内部クエリsleep(5)が最初に評価され、その結果は 'WHERE id = 0'が発見される前に暗黙的に" x "何にもマッチしない –

関連する問題