当我在SQL服务器上执行此SQL代码时:
SELECT SLEEP(3);
服务器休眠3秒钟。但是,当我执行此代码时:
SELECT * FROM costumers WHERE EXISTS(SELECT SLEEP(3));
服务器立即打印表'costumers'而不等待3秒......是否有一个SLEEP函数的解释,只是在从EXISTS块调用它时不等待指定的持续时间返回?这段代码中的BENCHMARK函数也是如此:
SELECT * FROM costumers WHERE EXISTS(SELECT BENCHMARK(100, MD5(1)))
我需要在这个特定的结构中执行'SLEEP'函数,因为它在SQL注入练习中使用,更准确地说是盲注SQL练习。
另外,如果您知道另一种编写使服务器等待的MYSQL语句的方法,那将会有所帮助。
答案 0 :(得分:1)
查询优化器显然确定SELECT SLEEP(3)
始终返回TRUE
,因此会删除代码。
此查询会休眠:
SELECT * FROM table1 WHERE EXISTS(SELECT SLEEP(3) UNION SELECT 1);
对于MySQL优化器来说,联合显然太复杂了,所以它执行它。实际上,在此查询上使用EXPLAIN
需要3秒 - 它意识到子查询不依赖于任何表,因此它在确定查询计划时执行它。
答案 1 :(得分:0)
我认为你会被困在
SELECT SLEEP(3); SELECT * FROM customers;
组合。