繁体   English   中英

选择查询的准备语句问题

[英]Problems with prepared statements for a select query

我有一个在php / mysql上运行的应用程序,并且它最近进入了生产阶段,因此我需要从防止SQL注入的某种保护开始保护整个基础结构。 我正在做的一件事是将用户的所有输入转换为准备好的语句,而不是直接查询。 直到我开始在登录页面上工作之前,这一直很好。 以下代码是(仅适用于mysql查询)

  1. 我今天使用的(不安全)但有效的代码
  2. 替换无法正常工作的代码。

对于此示例,user_list将是我在数据库和usr,pswHash上的表,这些字段用于检查登录。 id将是自动递增的行标识符。

1)

$sql_query = "SELECT * FROM user_list WHERE usr = $user AND pswHash = $passHash";

2)

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

第二个代码段不起作用,因为无论使用正确还是错误的usr / pass组合,查询的输出在任何情况下都将为null。

如果这还不够,我可以发布整个代码片段,但是我想这个问题与SQL查询有关。 谢谢您的帮助

这是我的编码方式:

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_hash()创建了密码哈希。

始终检查prepare()execute()以查看其是否返回false 如果这样做,则记录$mysqli->error ,并继续观察您的http服务器错误日志。 这是开发SQL查询时的一般建议。 如果您写错了SQL语法,或者您没有正确的SQL特权,或者发生了其他事情,您想知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM