2

SQL インジェクションに関する記事があります: Abusing MySQL string Math 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

-あなたは1つの空の文字列''から他の 文字列にマイナスです:

以下を参照してください。

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)    

2つの警告:

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 はその引数を減算する前に数値に変換します。の数値''は 0 ですが、それ自体から減算するといずれにせよ 0 になるため、あまり重要ではありません。

于 2013-01-19T05:26:23.590 に答える