有一篇关于SQL注入的文章:Abusing MySQL string arithmetic 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)
我对这些结果感到非常困惑。
答案 0 :(得分: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)
答案 1 :(得分:2)
我会将select ''-''
解释为与select '' - ''
相同的select cast('' as int) - cast('' as int)
select 0-0
。
使用select '-'
,您只需获得一个字符串。希望有意义......
答案 2 :(得分:1)
''
是一个空字符串; -
是减法。所以你要从另一个中减去一个空字符串。减法是一个数字运算符,因此它的结果是一个数字,mysql在减去它们之前将其参数转换为数字。 ''
的数值为零 - 但它并不重要,因为从中减去的任何数字无论如何都将为零。