使用mysql_query成功的注入攻击,但是使用mysqli_query失败

时间:2015-06-28 19:39:40

标签: php mysql mysqli

更新:对此有一些有启发性的回应,主要观点是mysql函数已弃用,mysqli允许您使用预准备语句。这很有意义,并且很有帮助,而只是"使用mysqli"在我看来,既不具有建设性,也没有帮助。

任何时候在SO上询问PHP和MySQL问题,OP都有使用mysql_query的代码,本能的社区反应是评论他们应该使用mysqli函数系列。

如果我的代码使用mysql_query,您能否提供一个恶意用户可以启动成功注入攻击的场景,但如果尝试进行相同的攻击则会受到阻碍,但代码使用了{{ 1}}功能呢?假设一个语句中的多个查询被禁用,这是典型的情况。

2 个答案:

答案 0 :(得分:6)

我一直认为:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");
使用$idValue的值关闭'然后添加额外的命令(例如

),

很容易受到攻击

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

虽然我意识到你声明禁用了多个语句,但是一些不那么可怕的事情就是返回未经授权的数据,而不是直接在表格中编辑数据,例如:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

然而,对于MySQLi,存在可能性,该方法可以与prepared statements一起使用,这将阻止变量在其状态之外作为变量。如:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

我对bind_param的理解是变量会使所有MySQL关键字和关键字符都被转义,从而防止安全漏洞和未授权行的返回。

这是MySQL 没有 的选择。准备好的语句确实有助于提高注入安全性,但它们不会单独阻止注入攻击,但程序员应该将更多应用作更广泛策略的一部分。

穿着防弹衣不会让你立于不败之地,但它会大大提高你的生存机会。 MySQLi不是灵丹妙药,也不是PDO,但它们将提高整体的安全级别。

MySQL也被弃用,正如克里斯托弗所说,不再维护意味着漏洞的数量和问题只会随着其他技术的不断发展而增加。

摘要

如果您以与编写MySQL语句相同的方式编写MySQL i 语句,那么您将无法获得额外的注入保护。但是,MySQLi提供 Prepared Statements 方法,它显着增加了对SQL注入的防御,但是底层数据库接口的更改本身并没有给你任何固有的好处或保护除非你选择使用预准备语句编写这些代码。

答案 1 :(得分:3)

我认为,没有这种情况。更重要的是MySQLi支持预处理语句,这是防止SQL注入的最可靠方法。如果使用旧的MySQL API,则不支持这些高级功能。 MySQL和MySQLi都有函数mysql * _real_escape_string,它可以在不使用引号的情况下进行攻击,例如1 OR 1