【发布时间】:2012-08-09 00:04:30
【问题描述】:
在this question 和一些 cmets 中,这个输入:
$input = '; DELETE FROM table_name ; #';
建议作为 SQL 注入此 PHP 语句的示例:
$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 注入会成功?这是因为 MySQL 在周围的 SELECT 查询之前解析并运行 DELETE 查询吗?当然,我不打算依靠这样弱的 PHP 代码或 MySQL 语法错误来防范 SQL 注入。这个例子让我很感兴趣。
【问题讨论】:
标签: mysql sql-injection