2

如何转义名为 的表名log\'; WAITFOR DELAY \'0:0:5\';--

我想删除表。

这些都不起作用:

SHOW TABLES LIKE 'log\\\'; WAITFOR DELAY \\\'0:0:5\\\';--';
SHOW TABLES LIKE "log\\'; WAITFOR DELAY \\'0:0:5\\';--";
SHOW TABLES LIKE `log\\'; WAITFOR DELAY \\'0:0:5\\';--`;

最后一个给出错误,而其他没有给出结果。错误是:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`log\\'; WAITFOR DELAY \\'0:0:5\\';--`' at line 1
4

3 回答 3

2

这些语句将返回表名(如果表存在):

SHOW TABLES LIKE "log\\\\'%"

SHOW TABLES LIKE "log\\\\'; WAITFOR DELAY \\\\'0:0:5\\\\';--"

SELECT table_name FROM information_schema.tables 
 WHERE table_name LIKE "log\\\\'; WAITFOR DELAY \\\\'0:0:5\\\\';--"

要在 SQL 语句中引用表名,您需要使用反引号将名称括起来,例如:

SELECT 1 FROM `log\'; WAITFOR DELAY \'0:0:5\';--` LIMIT 1 ;

RENAME TABLE `log\'; WAITFOR DELAY \'0:0:5\';--` TO `foo` ;

DROP TABLE `log\'; WAITFOR DELAY \'0:0:5\';--` ;

注意:在 SQL 语句中引用对象名称时,名称中的反斜杠和特殊字符不需要转义,只需将其括在反引号中即可。但是这些反斜杠在被解释为字符串文字时确实需要转义,就像在 LIKE 谓词中一样。

(我去过那里并做到了,创建了一个不稳定的表名。)


要删除名称以 开头的所有表log\',我将分两步进行。首先,我会生成 DROP TABLE 语句,然后我会执行这些语句。

SELECT CONCAT('DROP TABLE `',table_name,'`;') 
 FROM information_schema.tables
WHERE table_name LIKE "log\\\\'%"
  AND table_schema = DATABASE()
于 2012-07-05T16:22:39.227 回答
0
`log\'; WAITFOR DELAY \'0:0:5\';--`

试试看。

编辑

编辑自

`log\\'; WAITFOR DELAY \\'0:0:5\\';--`

`log\'; WAITFOR DELAY \'0:0:5\';--`
于 2012-07-05T16:14:31.773 回答
0

表名实际上是否包含 \ 字符,还是只是log'; WAITFOR DELAY '0:0:5';--?因为根据http://dev.mysql.com/doc/refman/5.0/en/identifiers.html表名中不允许使用 \ 字符。

这是否有效:

SHOW TABLES LIKE `log'; WAITFOR DELAY '0:0:5';--`;
于 2012-07-05T16:24:07.620 回答