-1

据我所知,在 PHP 中,您一次只能执行一个插入语句:(如果这严重错误,请不要继续阅读其余部分 :))

这不会插入任何行:

$query = "insert into users (email) values ('test1');insert into users (email) values ('test2'); ";
$result = mysql_query($query);

而这将插入一行:

$query = "insert into users (email) values ('test1');";
$result = mysql_query($query);

首先,到目前为止我所说的是否正确?

如果是这样,这是否意味着不可能进行类似于(只是猜测)的 SQL 注入:

$_GET['bad_var'] = '1");drop table users;'
$query = "insert into users (email) values (".$_GET['bad_var'].")";
$result = mysql_query($result);

这将导致insert into users (email) values ("1");drop table users;

或者每个查询假设的一个语句在这里证明是正确的

4

2 回答 2

1
  1. 据我所知,在 PHP 中,您一次只能执行一个插入语句:(如果这严重错误,请不要继续阅读其余部分 :))

    这取决于。PHP 提供了几种访问 MySQL 的方法,其中一些支持多/批处理语句,而另一些则不支持。

    您的问题中给出的示例使用了古老的(现在已弃用,自 PHP v5.5 起)ext/mysql扩展,自 2011 年 6 月以来,文档中明确不鼓励在新代码中使用该扩展。就mysql_query()函数而言,您是正确的,即此扩展的一部分,不支持多/批处理语句:

    mysql_query()将唯一查询(不支持多个查询)发送到与指定link_identifier.

    改进的 MySQLi 扩展在其文档中对您的问题提出了类似的观点:

    安全注意事项

    API 函数mysqli_query()mysqli_real_query()没有设置激活服务器中的多查询所需的连接标志。对多个语句使用额外的 API 调用,以减少意外 SQL 注入攻击的可能性。攻击者可能会尝试添加语句,例如;删除数据库 mysql; 选择睡眠(999)。如果攻击者成功在语句字符串中添加 SQL 但未使用mysqli_multi_query,则服务器不会执行第二条注入的恶意 SQL 语句。

    然而,其他方法可能无法提供这种保护。

  2. 如果是这样,那是否意味着不可能进行 SQL 注入

    虽然阻止执行第二条语句在一定程度上缓解了 SQL 注入攻击,但并不能完全阻止它们。当然不应该依赖这种保护。

于 2013-06-02T18:55:32.387 回答
1

完全误读了最初的问题,道歉。

要回答实际问题,是的,mysql_query 允许您一次只执行一个语句,从而减轻特定的 SQL 注入向量。看到这个类似的问题:你如何在一个 mysql_query 中执行多个 SQL 语句?

于 2013-06-02T18:41:55.030 回答