带有睡眠函数的 where 子句中的短划线 ( - )

dash ( - ) in where clause with sleep function

提问人:secf00tprint 提问时间:5/30/2020 最后编辑:secf00tprint 更新时间:5/30/2020 访问量:350

问:

在 MySQL 中,您可以使用 SLEEP 函数暂停结果 x 秒。

我明白当你这样使用它时:

SELECT SLEEP(1000);

但是我最近看到,你可以用这种形式来增强查询:

mysql> select * from docs where rev = 1-sleep(4);

它将等待 4 秒钟,然后返回结果,与

mysql> select * from docs where rev = 1;

为什么会这样?破折号是连接函数的一种形式还是类似的东西?我找不到这种语法的任何解释。


我使用 docker 重现了这个查询

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest
docker exec -ti some-mysql mysql -uroot -pmy-secret-pw

和以下代码创建表(使用 SQL Fiddle 中的代码)并验证行为。

CREATE test;
USE test;
CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) unsigned NOT NULL,
  `rev` int(3) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  PRIMARY KEY (`id`,`rev`)
) DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`id`, `rev`, `content`) VALUES
  ('1', '1', 'The earth is flat'),
  ('2', '1', 'One hundred angels can dance on the head of a pin'),
  ('1', '2', 'The earth is flat and rests on a bull\'s horn'),
  ('1', '3', 'The earth is like a ball.');
select * from docs where rev = 1;
select * from docs where rev = 1-sleep(4);
MySQL 数据库 SQL注入 休眠

评论

2赞 vhu 5/30/2020
我们使用类似的东西作为微创但易于识别的 SQL 注入测试用例

答:

4赞 Nico Haase 5/30/2020 #1

正如您在链接的手册中所读到的,返回 0。因此,在某种计算中使用它,例如触发执行(例如:等待四秒)。之后,使用 恢复查询,使其等于SLEEPwhere rev = 1-sleep(4);SLEEPwhere rev = 1-0where rev = 1