3

この質問といくつかのコメントでは、この入力:

$input = '; DELETE FROM table_name ; #';

このPHPステートメントへのSQLインジェクションの例として提案されました。

$input = $_POST['input'];
'SELECT '.$input.' FROM table_name'

#の代わりに*を使用しましたが、チェイスに割り込んでMySQLの例を直接使用しました。結果は同じです。

CREATE TABLE a_table (
 id INT NOT NULL);

INSERT INTO a_table (id) VALUES (1), (2), (3), (4), (5);
SELECT * FROM a_table;
SELECT ; DELETE FROM a_table; * FROM a_table;
SELECT COUNT(*) FROM a_table;

これは以下を出力します:

mysql> SELECT * FROM a_table;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> SELECT ; DELETE FROM a_table; * FROM a_table;
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 '' at line 1
Query OK, 5 rows affected (0.03 sec)

mysql> SELECT * FROM a_table;
Empty set (0.00 sec)

構文エラーにもかかわらず、このSQLインジェクションが成功するのはなぜですか?DELETEこれは、MySQLが周囲のクエリの前にクエリを解析して実行するためSELECTですか?もちろん、SQLインジェクションを防ぐためにこのような弱いPHPコードやMySQL構文エラーに依存するつもりはありません。この例は私に興味をそそられました。

4

1 に答える 1

2

mysqlは;各クエリを区切るために使用するため、クエリは引き続き実行されます。許可すると、構文エラーが発生した場合でもクエリの実行が継続されます。SequelProでクエリを実行すると、構文エラーに関するメッセージが表示され、すべてのクエリの実行を続行するか停止するかを確認するメッセージが表示されます。ただし、MySQLコマンドラインで直接実行すると、クエリは実行を継続し、MySQLはエラーメッセージを表示して、期待どおりに次のクエリに進みます(PHPコードで発生するのと同じことです)。

于 2012-08-09T00:11:45.890 に答える