为何mysqli_query无法执行SQL注入?需改用mysqli_multi_query
为什么mysqli_query无法执行堆叠SQL注入,而mysqli_multi_query可以?
嘿,这个问题其实戳中了mysqli两个核心函数的设计差异,我来帮你拆解清楚:
1. mysqli_query的核心限制:一次只能执行单条SQL语句
mysqli_query从设计上就不支持多语句(堆叠)执行——它会把你传入的整个字符串当作一条完整的SQL语句去解析。
看你拼接后的SQL:
SELECT * FROM users WHERE name = ''; DROP TABLE testTable --'
MySQL会把这个字符串当作单条语句处理:第一个'闭合了name的取值,后面的; DROP TABLE testTable --'就成了语法错误的冗余内容,自然会抛出你看到的语法错误。这是mysqli的安全设计之一,默认防止恶意的堆叠注入。
2. 为什么有些教程说mysqli_query能实现注入?
那些教程里的注入大概率是单语句注入,比如输入' OR 1=1 --,拼接后的SQL是:
SELECT * FROM users WHERE name = '' OR 1=1 --'
这是一条完全合法的单语句,mysqli_query可以正常执行,能返回所有用户数据——这属于逻辑篡改的注入,不需要执行多条语句,所以用mysqli_query就能生效。
而你尝试的是堆叠注入(在一条请求里执行多条独立的SQL语句),这种场景必须使用专门设计的mysqli_multi_query,它就是用来处理多语句执行的函数。
3. 额外验证:试试单语句注入
如果你在表单里输入' OR 1=1 --,用你当前的代码(mysqli_query)就能成功执行,返回所有users表的数据——这就是教程里说的“用mysqli_query实现注入”的场景,和你尝试的堆叠注入不是一回事。
总结一下:
- 单语句注入(篡改现有SQL逻辑):mysqli_query可以执行
- 堆叠注入(执行多条独立SQL):必须用mysqli_multi_query
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

