0

我无法弄清楚为什么在激活后尝试登录时密码不匹配。为了便于查看,我已经修剪了下面粘贴的代码。

以下是相关的注册码:

$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 { ...

到目前为止,我已经进行了几次迭代,但无济于事。任何见解将不胜感激。

4

3 回答 3

1

目前,您的代码容易受到 SQL 注入的影响。一个建议是使用PDOMySQLI重新格式化您的代码。

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);

$rowHere在您的IF声明中使用。

于 2012-08-06T23:00:45.040 回答
0
$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_*

编辑:请立即尝试。我认为它只能保存一个值(用于登录目的)

于 2012-08-06T22:49:04.953 回答
0

你需要使用mysqli_fetch_array.

此外,mysql_*函数已被弃用。请改用MySQLiPDO

而且您需要“清理您的输入”(一个常用短语)以避免 SQL 注入、使用mysqli_real_escape_stringPDO

根据对问题的评论,请参阅Bobby Tables链接。

于 2012-08-06T23:14:48.750 回答