mysqli准备好的语句是否能完全保护mysql注入?

时间:2013-04-04 06:47:20

标签: php mysqli sql-injection

所以我一直在阅读有关准备好的陈述的很多内容,并且不断得到关于准备好的语句如何防止mysql注入的各种答案。有些人说它完全覆盖了它,而另一些人则认为还有一些小工作或其他东西。我只是想确保我的代码是安全的,并且知道预备语句中是否有任何漏洞:

<?php
ignore_user_abort(true);

$user = $_REQUEST['username'];
$pass = $_REQUEST['password'];

if (isset($user) && isset($pass)) {
require('/var/www/data/config.php'); //contains the db connection

if ($stmt = mysqli_prepare($mysqli, "SELECT password FROM users WHERE username=?")) {
    mysqli_stmt_bind_param($stmt, 's', $user);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $gpass);
    mysqli_stmt_fetch($stmt);
    mysqli_stmt_close($stmt);

    if ($gpass) {
        require('/var/www/data/handles/fCrypt.php');

        $chk = verify($pass, $gpass); //custom blowfish validation

        if ($chk) {
            //password correct, continue
        } else {
            mysqli_close($mysqli);
            //echo invalid password stuff
        }
    } else {
        mysqli_close($mysqli);
        //echo invalid username stuff
    }
} else {
    mysqli_close($mysqli);
    die('Query Error');
}
} else {
die('Invalid Request');
}
?>

2 个答案:

答案 0 :(得分:2)

与任何其他衡量标准一样,适用时 因此,在不适用时,他们无法提供帮助。

因此,只要您可以通过占位符添加每个动态查询部分,就可以认为您的查询是安全的。

一张纸条。这就是为什么你不应该使用mysqli但转移到PDOSafeMysql的原因。

尝试创建一个简单的IN()语句,使用mysqli预处理语句绑定任意数量的值的数组。您将立即退出使用它。

PDO对IN()语句也不太好,但代码至少是合理的。

答案 1 :(得分:1)

我不是这个主题的专家,但我会说安全首先是一个实践问题。但是,只要你遵循它,它确实有助于提供更容易遵循正确方法的工具。

该工具如何帮助您实现这一目标存在一些限制:评论中提到的that post on PDO usefullness非常清楚。 对于其中一些,很难理解为什么(IN子句可能是技术问题),但其他问题很有意义:对于查询的语法部分,如表​​或列名称 - 在事实上,如果数据库引擎在不知道它正在处理哪个列或表的情况下编译和优化查询,那将是非常困难的,不应该任何原因这样的数据来自用户(人们会争辩说,数据库管理工具可能会出现这种情况,但该类程序已经假定与最终用户具有一定程度的信任)。

program 是唯一知道和操作db元数据的地方。该断言实际上意味着它是 ok 动态地逐位构建查询,甚至使用库来帮助您确保查询在语法上是正确的,只要您尊重该核心规则:不要将db模式泄漏到userland。

关于你的代码,在我看来你遵守了规则,我没有看到任何危险的声明。