这里有关于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);
无法访问数据库的恶意用户如何注入恶意数据,如果甚至不支持多个查询?
或者是他们?
答案 0 :(得分:1)
如果甚至不支持多个查询,那么无法访问数据库的恶意用户如何注入恶意数据?
“SQL注入”不等于“第二次查询”。
或者是他们?
他们当然是。
第二个查询只是一个示例。虽然它可以是任何有效的SQL语句。 SQl注入是对格式不正确的查询的利用。如果开发人员没有正确格式化SQL,则有可能突破文字限制并将代码添加到SQL主体。
通过添加第二个查询实际上是否可以进行SQL注入?
是的,取决于您使用的API。
答案 1 :(得分:0)
这不适用于mysql和php 而没有经过深思熟虑的步骤使其成为可能,因为the normal query function只会执行第一个查询。
这并不意味着它不可能 - 只有它应该是very obvious。
但是上面的意思几乎没有任何关于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没有被转义,删除所有评论将是微不足道的。但这个例子只是冰山一角。
此问题中的代码:
$stm = $pdo->prepare("INSERT INTO table (Column) VALUES ('$unsafe')");
$stm->execute();
使用PDO没有任何好处 - 也就是说,使用mysql / mysqli驱动程序(天真地使用)的任何利用(真正庞大的数字)都可以使用这种方式使用的pdo。
将{{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'";
...
}
恶意用户如何在不关注注入的情况下访问系统上的管理功能?很容易。
有关注射的一般信息,请参阅之前的参考文献。