通过添加第二个查询实际上是否可以进行SQL注入?

时间:2013-10-29 18:36:03

标签: php mysql sql pdo sql-injection

这里有关于SQL注入的很多警告,但我发现没有人真的回答,它是怎么回事?在这个问题中,我假设它是MySQL和PHP。

基本的 mysql _ 不接受查询中的第二个查询,对吗?

所以,基本上,这个

$unsafe = "');DROP TABLE table;--";    
mysqli_query($con,"INSERT INTO table (Column) VALUES ('$unsafe'");

实际上没有做任何有害的事情?纠正我的事。

我没有使用 mysqli _ 的经验,因此我将跳到PDO和“准备好的陈述”。

当我开始使用PDO时,我缺乏相关信息,基本上就像这样使用它,认为它是安全的。

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe');
$stm->execute();

然而,与 mysql _ 一样,PDO也是如此。它不支持开箱即用的多个查询,对吗?再次,纠正我这一点。

然后,如果我没有错,这是安全的吗?

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?);
$stm->execute(array($unsafe);

无法访问数据库的恶意用户如何注入恶意数据,如果甚至不支持多个查询?

或者是他们?

2 个答案:

答案 0 :(得分:1)

  

如果甚至不支持多个查询,那么无法访问数据库的恶意用户如何注入恶意数据?

“SQL注入”不等于“第二次查询”。

  

或者是他们?

他们当然是。

第二个查询只是一个示例。虽然它可以是任何有效的SQL语句。 SQl注入是对格式不正确的查询的利用。如果开发人员没有正确格式化SQL,则有可能突破文字限制并将代码添加到SQL主体。

  

通过添加第二个查询实际上是否可以进行SQL注入?

是的,取决于您使用的API。

答案 1 :(得分:0)

使用mysql + php的两个查询是一个谬误

Did you really name your son "Robert'); Drop TABLE Students;--"

来源:http://xkcd.com/327/

这不适用于mysql和php 而没有经过深思熟虑的步骤使其成为可能,因为the normal query function只会执行第一个查询。

这并不意味着它不可能 - 只有它应该是very obvious

SQL注入非常真实

但是上面的意思几乎没有任何关于sql注入的内容。有大量关于sql injection large number of questions here on stack overflow 大量信息,包括PDO with prepared statements。以问题为例,这是 工作的等效攻击:

$id = "123 OR 1 = 1 --";
mysqli_query($con,"DELETE FROM table WHERE id = $id LIMIT 1");

即。找到一个删除我自己的界面,例如评论,如果id没有被转义,删除所有评论将是微不足道的。但这个例子只是冰山一角。

执行任意sql语句是可利用的

此问题中的代码:

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe')");
$stm->execute();

使用PDO没有任何好处 - 也就是说,使用mysql / mysqli驱动程序(天真地使用)的任何利用(真正庞大的数字)都可以使用这种方式使用的pdo。

参数化查询可防止sql注入

将{{3}} 与参数一起使用可以适当地转义值以防止sql注入攻击,所以这是注入安全的:

$stm = $pdo->prepare("INSERT INTO table (Column) VALUES (?)");
$stm->execute(array($unsafe));

无法访问数据库的恶意用户如何注入恶意数据

只需找到一种方法来执行sql,或者执行他们想要做的事情,或者给他们提供不同方式的信息。

例如:

function login() {
    $username = "irrelevant' OR is_admin = 1 --";
    $password = hash('irrelevant');
    $query = "SELECT id from users where username = '$username' AND password = '$password'";
    ...
}

恶意用户如何在不关注注入的情况下访问系统上的管理功能?很容易。

有关注射的一般信息,请参阅之前的参考文献。