PHP mysql接口是否固有地防止注入结束和开始新的查询?


does a php mysql interface inherently prevent injection of ending and starting new queries

据我所知,在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;

还是每查询一条语句假设在这里证明是正确的

  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注入攻击的可能性。攻击者可能会尝试添加如下语句:;DROP DATABASE mysql or ;选择睡眠(999)。如果攻击者成功地在语句字符串中添加了SQL,但是没有使用mysqli_multi_query,服务器将不会执行第二个注入的恶意SQL语句。

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

    虽然阻止执行第二条语句在某种程度上减轻了对SQL注入攻击的攻击,但它并不能完全阻止它们。我们当然不应该依赖这样的保护。

完全误解了开头的问题,抱歉。

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