首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么即使SQL语句生成语法错误,此SQL注入仍能成功?

为什么即使SQL语句生成语法错误,此SQL注入仍能成功?
EN

Stack Overflow用户
提问于 2012-08-09 08:04:30
回答 1查看 544关注 0票数 3

this question和一些注释中,输入如下:

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

建议将SQL注入到此PHP语句中:

代码语言:javascript
复制
$input = $_POST['input'];
'SELECT '.$input.' FROM table_name'

我切入正题,直接在MySQL中使用了一个例子,尽管我用*代替了#。结果是一样的。

代码语言:javascript
复制
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;

这将输出以下内容:

代码语言:javascript
复制
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在解析和运行周围的DELETE查询之前解析并运行了SELECT查询吗?当然,我不打算依靠如此弱的PHP代码或SQL语法错误来防止MySQL注入;这个示例只是引起了我的兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-09 08:11:46

查询仍然在运行,因为mysql使用;来分隔每个查询,即使出现语法错误,它也会继续运行查询。在SequelPro中运行查询时,我得到一条有关语法错误的消息,并提示我是继续运行所有查询还是停止。但是,在MySQL命令行中直接运行它们,查询将继续运行,MySQL只会给出一条错误消息,并按预期继续执行下一个查询(与PHP代码中发生的情况相同)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11874991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档