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