当我尝试输入真实密码时,它不起作用并且说密码不正确。
但是,当我尝试输入哈希密码时。它说:"成功登录"。
如何使用真实密码登录而不是哈希?!
<form method="post" action="loginsession.php">//login
<p>Username <input type="text" name="uid" size="20"> </p>
<p>Password <input type="password" name="pwd" size="20"> </p>
<p><input type="submit" value="Login" name="login"></p>
</form>
Loginsession.php
<?php
session_start();
include ('dbhandler.php');
$uid = $_POST['uid'];
$pwd = $_POST['pwd'];
$sql = "SELECT * FROM user WHERE uid='$uid' and pwd='$pwd' ";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
$encrypted_pwd = password_hash($pwd, PASSWORD_DEFAULT);
$hash = password_verify($pwd,$encrypted_pwd);
$count = mysqli_num_rows($result);
if ($count == 1) {
echo("Logging in...");
$_SESSION['id'] = $row['id'];
$_SESSION['uid'] = $row['uid'];
$_SESSION['pwd'] = $row['pwd'];
echo("<h1 style='color:green;'>Successfully Logged In");
}
else {
echo "Your Login Name or Password is invalid";
die();
}
?>
答案 0 :(得分:2)
错误很多,重写更合适:
<?php
session_start();
include 'dbhandler.php'; // shouldn't be include './dbhandler.php'; ?
$uid = $_POST['uid'];
$pwd = $_POST['pwd'];
$sql = "SELECT * FROM user WHERE uid='".mysqli_real_escape_string($conn, $uid)."'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) === 1) {
$row = mysqli_fetch_assoc($result);
if (password_verify($pwd, $row['pwd'])) {
$_SESSION['id'] = $row['id'];
$_SESSION['uid'] = $row['uid'];
$_SESSION['pwd'] = $row['pwd'];
// redirect to "login success" page would be a better solution
echo "<h1 style='color:green;'>Successfully Logged In";
} else {
echo "Invalid password";
}
} else {
echo "Your login name is invalid";
}
答案 1 :(得分:0)
您绝不应将文本用户输入用作查询的参数。这使您容易受到SQL injection的攻击。为了防止这种情况,请使用PDO或mysqli_*(但在这种情况下使用适当的函数来转义参数),这些都有详细记录。
您可以按原样传递密码来定义和执行查询。您需要在将密码传递给查询之前对密码进行哈希处理,并将$encrypted_pwd
传递给查询。
在这种情况下,我建议在查询结束时使用limit 0, 1
,因为这将指定您只对第一个相应的行感兴趣,如果存在,那么查询将是如果找到用户则停止并且不继续搜索用户。这将优化您的查询。
由于您不想加载与用户相关的任何特定数据,因此您只想确定用户是否存在,您可以通过将select *
替换为{{1}来进一步优化您的查询这将显着减少你的RDBMS必须发送的数据大小,因为只返回一个数字,而不是整个记录,可能还有用户的传记。
永远不要在会话中存储用户密码。如果出于某种原因select 1
将被输出到浏览器,那将是一个严重的漏洞。