0

因此,我一直在阅读很多关于准备好的语句的内容,并不断得到关于准备好的语句如何防止 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');
}
?>
4

2 回答 2

2

与任何其他措施一样,它们在适用时起作用
因此,它们在不适用时无能为力。

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

一张纸条。这就是为什么您不应该使用 mysqli 而是使用PDOSafeMysql的原因。

只需尝试创建一个简单的IN()语句,使用 mysqli 准备好的语句来绑定任意数量的值数组。您将立即停止使用它。

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

于 2013-04-04T06:52:42.367 回答
1

我不是这个主题的专家,但我会说安全首先是实践问题。但是,只要您遵循正确的方法,拥有可以更轻松地遵循正确方法的工具肯定会大有帮助。

该工具如何帮助您实现该目标存在局限性:评论中提到的关于 PDO 有用性的帖子很好地涵盖了它们。对于其中一些人来说,很难理解为什么(IN 子句问题可能是技术问题),但其他人则很有意义:对于查询的句法部分,如表​​或列名 - 除了它会是数据库引擎在不知道它正在处理哪个列或表的情况下编译和优化查询是相当困难的,这样的数据来自用户不应该有任何理由(人们会争辩说,数据库管理工具是一种情况这可能会发生,但该类别的程序已经假定最终用户具有一定程度的信任)。

唯一知道和操纵数据库元数据的地方是程序。该断言实际上意味着可以位动态构建查询,甚至可以使用库来帮助您确保查询在语法上是正确的,只要您尊重该核心规则:不要泄漏数据库模式到用户空间。

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

于 2013-04-04T07:17:13.420 回答