我无法弄清楚为什么激活后尝试登录时密码不匹配。为了便于查看,我修剪了下面粘贴的代码。
以下是相关的注册码:
$salt = substr(sha1(uniqid(rand(),true)),0,20);
$password_db = hash('sha256', $salt.$password1);
$sqlinfo = mysql_query("INSERT INTO db_1 (email, password, salt)
VALUES('$email1','$password_db','$salt')") or die(mysql_error());
以下是用于登录的相关代码:
$email = $_POST['email'];
$password = $_POST['password'];
$sqlinfo = mysql_query("SELECT * FROM db_1 WHERE email='$email' AND emailactiv='1'");
if($sqlinfo['password'] == hash('sha256', $sqlinfo['salt'].$password)){
while($row = mysql_fetch_array($sqlinfo)){
... }
else { ...
到目前为止,我已经进行了几次迭代,但无济于事。任何见解将不胜感激。
你编码,目前,在SQL注入中是脆弱的。一个建议是使用 PDO 或 MySQL 重新格式化代码。
PDO示例:
<?php
$stmt = $dbh->prepare("SELECT * FROM db_1 WHERE email = ? AND emailactiv=? ");
$stmt->bindParam(1, $email);
$stmt->bindParam(2, 1);
$stmt->execute();
?>
您没有获取该行,这就是它与任何内容不匹配的原因。在 IF
语句之前添加以下行:
$rowHere = mysql_fetch_row($sqlinfo);
并在IF
语句中使用$rowHere
。
$email = $_POST['email'];
$password = $_POST['password'];
$sqlinfo = mysql_query("SELECT * FROM db_1 WHERE email='$email' AND emailactiv='1'");
//You need to first fetch data before using it.
while($result = mysql_fetch_array($sqlinfo)) {
//Now you can use the data
if($result['password'] == hash('sha256', $result['salt'].$password)){
//matched... login correct
} else {
//not matched.. invalid login
}
}
...
希望这是不言自明的。你错过了一条非常重要的台词!
顺便说一句,停止使用 mysql_* 函数,因为它们已弃用,使用 PDO 或 mysqli_*
编辑:请立即尝试。我以为它只能保存一个值(用于登录目的)
你需要使用 mysqli_fetch_array
.
此外,mysql_*
函数已弃用。请改用MySQLi或PDO。
你需要"清理你的输入"(一个常用短语)以避免SQL注入,使用mysqli_real_escape_string
或PDO。
根据对问题的评论,请参阅鲍比表格链接。