You need to enable JavaScript to run this app. PDO拼接SQL构造SQL注入执行失败,求问题原因分析
优惠活动
大模型
产品
解决方案
定价
更多

PDO拼接SQL构造SQL注入执行失败,求问题原因分析

你遇到的问题和PHP新增的全局防护机制无关,核心原因是PDO MySQL驱动的默认配置限制:

  • PDO默认禁用**多语句执行(multi-statement)**功能,exec()方法默认不支持单次执行多条用分号分隔的SQL语句。你构造的注入payload是在INSERT语句后拼接了DELETE语句,属于多语句执行场景,会直接被数据库识别为语法错误,所以注入无法成功。
  • 你在PHPMyAdmin中可以执行成功,是因为PHPMyAdmin自身实现了多语句拆分逻辑,会将你输入的多条SQL按分号拆分后逐条执行,和直接通过PDO提交单条字符串的逻辑不一样。

如果你需要复现堆叠注入场景给学生做演示,可以在初始化PDO连接时显式开启多语句执行配置,示例连接代码如下:

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', '用户名', '密码', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_MULTI_STATEMENTS => true // 显式开启多语句执行
]);

开启后你再提交之前构造的Bob'); DELETE FROM users where ('1' = '1 payload,即可成功执行DELETE语句完成注入。

这个场景刚好可以用来对比演示prepared statements的防护效果:哪怕你开启了多语句执行,只要使用预处理语句绑定参数,用户输入的内容只会被当做参数值处理,不会被解析为SQL语法的一部分,完全可以避免这类注入问题,不需要依赖多语句禁用这类配置层面的防护。

内容的提问来源于stack exchange,提问作者Khaldoun Nd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 11:27:02