2

有一篇关于 SQL 注入的文章:Abusing MySQL string algorithm for tiny SQL injections

问题是, 是什么意思select ''-''?我用 MySQL 试试,它返回:

mysql> select ''-'';
+-------+
| ''-'' |
+-------+
|     0 |
+-------+
1 row in set (0.00 sec)

发生了什么事?0是什么意思?

结果select '-'

mysql> select '-';
+---+
| - |
+---+
| - |
+---+
1 row in set (0.00 sec)

我对这些结果感到非常困惑。

4

3 回答 3

3

-从一个空字符串减去''另一个:

请参阅以下内容:

mysql> select '';
+--+
|  |
+--+
|  |
+--+
1 row in set (0.00 sec)  

mysql> select '3'-'2';
+---------+
| '3'-'2' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

但如果它不是数字字符串,则会发出警告:

mysql> select 'a'-'b';
+---------+
| 'a'-'b' |
+---------+
|       0 |
+---------+
1 row in set, 2 warnings (0.00 sec)    

两个警告:

mysql> SHOW WARNINGS LIMIT 2
    -> ;
+---------+------+---------------------------------------+
| Level   | Code | Message                               |
+---------+------+---------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b' |
+---------+------+---------------------------------------+
2 rows in set (0.00 sec)  

empty为什么没有字符串警告?

因为空字符串没有警告,因为它(铸造了一些东西)0见下文:

mysql> SELECT 0 = '';
+--------+
| 0 = '' |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)   

因此,通过做''-''你正在做0 - 0

mysql> SELECT '' - '';
+---------+
| '' - '' |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)  

为了更清楚,我添加了以下示例(我觉得对您有帮助):
转换是如何发生的:

mysql> SELECT '0' = 0
    -> ;
+---------+
| '0' = 0 |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)  

注意它的转换:

mysql> SELECT '' = '0'
    -> ;
+----------+
| '' = '0' |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)  

''转换成0'0'转换成0''不等于'0'

mysql> SELECT '1' = 1
    -> ;
+---------+
| '1' = 1 |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

mysql> SELECT '' = 1
    -> ;
+--------+
| '' = 1 |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec) 
于 2013-01-19T05:35:37.193 回答
2

我会解释select ''-'', 和select '' - '', 一样select cast('' as int) - cast('' as int)select 0-0..

有了select '-'你就得到一个字符串。希望这是有道理的...

于 2013-01-19T05:28:37.627 回答
1

''是一个空字符串;-是减法。所以你从另一个中减去一个空字符串。减法是一个数字运算符,所以它的结果是一个数字,mysql在减去它们之前将它的参数转换为数字。的数值''为零——但这并不重要,因为任何从自身减去的数字都会得到零。

于 2013-01-19T05:26:23.590 回答