[英]PDO select prepared statement does not work
这是源代码的代码段,是我用来练习PHP技能的代码段。 提交登录表单后,我尝试查看用户使用登录表单提交的用户名和密码是否与数据库中存储的用户名和密码匹配。 如果是,则“您的用户名和密码与我的密码匹配!” (显然,这不会是最终的回声,而只是要看看两者之间会带来什么回声)。 如果我给出正确的凭据(用户/密码)或凭据不正确,它会回显“您的用户名和密码与我的不匹配!” 块。 我看不到代码有任何问题,我的想法已经用完了。
config.php(我包括在内)中的部分代码是数据库的设置,具有注册表和少量字段,其中确实存在用户名和密码字段,因此也包含名称。
user是用户名登录表单上名称标签的值,pass是密码登录表单上名称标签的值。
<?php
include("config.php");
if(isset($_POST['submit'])) {
$stmt = $db->prepare("SELECT * FROM registration WHERE username = :username AND password = :password");
$stmt->execute(array("username" => $_POST['user'], "password" => $_POST['pass']));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if(($_POST['user'] == $result['username']) && $_POST['pass'] == hash("sha256",$result['password'])) {
echo "Your username and password matches what I have! <html><br /></html>";
} else {
echo "Your username and password DOES NOT matches what I have! <html><br /> </html>";
}
}
?>
您有一个向后存储密码的概念:您的代码将$_POST['pass']
与数据库中字符串的哈希值进行比较。 因此,要求用户输入密码的SHA256哈希吗? 并将明文密码存储在数据库中? 我不这么认为。
情况应该相反。 您允许用户输入密码,然后对他们输入的字符串进行哈希处理。 然后将其与数据库中存储的内容(也应为哈希字符串)进行比较。
$pass_hash = hash("sha256", $_POST["pass"]);
$stmt = $db->prepare("SELECT * FROM registration WHERE username = :username AND password = :password");
$stmt->execute(array("username" => $_POST['user'], "password" => $pass_hash));
您不必使用if()
来测试结果。 只需测试查询是否返回零行即可。 如果返回任何行,那么您找到了一个匹配项。
也不要假设fetch()
返回了一行。 如果没有行,则返回NULL,因此将该行用作关联数组将引发错误。 在取消引用行之前,测试以查看该行是否为非空。
if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// username and password matched a row
echo "Your username and password matches what I have! <html><br /></html>";
} else {
// no matching username
echo "Your username and password DOES NOT matches what I have! <html><br /> </html>";
}
这是我更喜欢的另一种变体:我只是寻找与用户名匹配的行,然后返回哈希密码字符串。 然后,我在应用程序代码中进行比较。 通过这种方式,我可以判断他们是否提供了合法的用户名,但密码错误。 您不一定要向用户透露此信息,但您可能想在应用程序中对其进行跟踪,因此,如果有人尝试为同一用户名输入数十个错误的密码,则可以锁定用户名或为操作员或用户记录警报的东西。
$stmt = $db->prepare("SELECT password FROM registration WHERE username = :username");
$stmt->execute(array("username" => $_POST['user']));
if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$pass_hash = hash("sha256", $_POST["pass"]);
if ($pass_hash == $row['password']) {
echo "Your username and password matches what I have! <html><br /></html>";
} else {
// username exists, but wrong password
echo "Your username and password DOES NOT matches what I have! <html><br /> </html>";
}
} else {
// no matching username
echo "Your username and password DOES NOT matches what I have! <html><br /> </html>";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.