0

SO上有很多关于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();

但是,PDO 与mysql_ 相同。它不支持开箱即用的多个查询,对吗?再次,纠正我这一点。

那么,这被认为是安全的,如果我没记错的话?

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

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

还是他们?

4

2 回答 2

1

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

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

还是他们?

他们当然是。

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

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

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

于 2013-10-29T18:47:15.517 回答
0

使用 mysql + php 进行两次查询是谬误

你真的给你儿子起名字了吗

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

如果没有经过深思熟虑的步骤,这将不适用于 mysql 和 php,因为正常的查询功能只会执行第一个查询。

这并不意味着它不可能——只是它应该是非常明显的。

SQL注入很真实

但是以上对于sql注入而言几乎没有任何意义。有大量关于sql注入的信息,包括关于堆栈溢出的大量问题。以问题中的示例为例,这是一种等效的攻击方法

$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 注入

PDO 与 带有参数的准备好的语句一起使用可以适当地转义值以防止 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'";
    ...
}

恶意用户如何在不担心注入的情况下访问系统上的管理功能?非常简单地。

有关注入的一般信息,请参阅前面的参考资料。

于 2013-10-30T09:37:17.273 回答