select查询的准备语句问题

jhiyze9q  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(418)

我有一个运行在php/mysql上的应用程序,它最近进入了生产阶段,所以我需要保护整个基础设施,从防止sql注入开始。我正在做的一件事是将用户的所有输入转换成预先准备好的语句,而不是直接查询。在我开始登录页面之前,这一切都很顺利。下面的代码是(仅限mysql查询)
我今天使用的(不安全的)但有效的代码
替换它的代码不起作用。
对于本例,user\u list将是数据库上的my表和usr、pswhash字段,用于检查登录名。id将是自动递增的行标识符。
1)

$sql_query = "SELECT * FROM user_list WHERE usr = $user AND pswHash = $passHash";
$stmt = $mysqli->prepare("SELECT * FROM user_list WHERE usr=? AND pswHash=?");
$stmt->bind_param('ss', $user, $passHash);

第二个代码片段是无效的,因为查询的输出在任何情况下都是空的,不管usr/pass组合是正确的还是错误的。
如果这还不够,我可以发布整个代码段,但我猜这个问题与sql查询有关。谢谢你的帮助

wvyml7n5

wvyml7n51#

下面是我的代码:

function password_matches($mysqli, $user, $pass) {
    $stmt = $mysqli->prepare("SELECT pswHash FROM user_list WHERE usr=?");
    // always check for errors after prepare()
    if (!$stmt) {
      error_log($mysqli->error);
      return false;
    }
    $stmt->bind_param('s', $user);

    $ok = $stmt->execute();
    // always check for errors after execute()
    if (!$ok) {
      error_log($mysqli->error);
      return false;
    }

    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
      if (password_verify($pass, $row['pswHash'])) {
        return true;
      }
    }
    // if the result set had zero matches for $user,
    // or if there were any matches for $user, but none of them
    // had a password hash matching the input
    return false;
}

这是假设您在将密码散列插入数据库之前使用password\u hash()创建密码散列。
总是两个都检查 prepare() 或者 execute() 看看它是否返回false。如果有,那就记录下来 $mysqli->error ,并继续监视http服务器错误日志。这是开发sql查询时的一般建议。如果您编写了错误的sql语法,或者您没有正确的sql特权,或者发生了其他事情,您需要知道。

相关问题