0

我似乎已经尝试了各种方法来让我的登录正常工作,但是当我尝试登录时,它会在用户密码处停止并且从不获取它。我在我的寄存器中使用 sha1 并且在插入数据库时​​工作正常。

$username = $_POST['username'];
$password = md5($_POST['password']);

$result = mysql_query("SELECT * FROM users WHERE username = '$username' ");



while ($row = mysql_fetch_array($result))
{
    if($username == $row['username'] )
    {
        if( $password == $row['password'])
        {
            header("location: profile.php");
        }
        else    
            echo 'pass problem';
    }
    else

        echo 'username issue ';


}
4

3 回答 3

2

这么多问题...

  1. md5不安全。使用盐+密钥+密码。
  2. mysql_功能已弃用。使用mysqli_PDO
  3. 没有卫生。使用准备好的语句和绑定参数。
  4. 不要SELECT *。只获取您需要的列。
  5. 添加一个LIMIT你想返回多少个结果
  6. 单个结果不需要while循环。
  7. 密码是如何存储在数据库中的?显然,md5'd 密码与您的列不匹配。

实际问题

如果用户的密码存储为sha1然后与md5.

于 2013-04-16T20:23:17.130 回答
1

我建议使用 PHPass 库来保护您的密码,因为 md5 和 shai 以及其他加密算法并不安全。

PHPass 负责

  1. 加密。
  2. 盐。
  3. 拉伸。

而且那个方法还没有被破解(暴力破解不能算PHPass的破解)。

你可以从这里得到它:http ://www.openwall.com/phpass/

一旦你设置了代码,它就很容易散列:

$hash = PasswordHash($iteration_count_log2, $portable_hashes)

然后您可以从数据库中获取存储的哈希,并通过函数将登录密码哈希与现有哈希匹配

$auth = CheckPassword($incomingPasswordNotHashed, $hashFromDatabase);

我喜欢通过做这样的事情来做一个哈希来使它更简单:

// Usage:   $hash = PHPhass($password);
// Pre:     $password is of type string,
//          indicating the password which
//          the user want's to hash.
// Post:    $hash is the hashed password.
function PHPhass($password)
{
    $unHashed = $password;
    require '../phpass/PasswordHash.php';
    header('Content-type: text/plain');
    $t_hasher = new PasswordHash(12, FALSE); // Define the iterations once.
    $hash = $t_hasher->HashPassword($unHashed);
    unset($t_hasher);
    return $hash;
}

并这样做以匹配哈希和非哈希密码:

// Usage:   $check = PHPhassMatch($password, $hash)
// Pre:     $password is of type string,
//          indicating a user's passwordd
//          $hash is a hashed password.
// Post:    $check is true if $password's hash
//          value is equal to $hash.
function PHPhassMatch($password, $hash)
{
    $unHashed = $password;
    $theHashed = $hash;
    require '../phpass/PasswordHash.php';
    header('Content-type: text/plain');
    $t_hasher = new PasswordHash(8, FALSE);
    $check = $t_hasher->CheckPassword($unHashed, $theHashed);
    unset($t_hasher);
    return $check;
}

此外,就像 Fresh 提到的:

  • 不要使用 mysql_*,因为它已被弃用,我建议使用 PDO 或 mysqli。
  • 使用准备好的语句来防止 sql 注入。
  • 不要假设已发布的变量已发布,请使用 isset() 检查它们是否存在

您提到了shai1,您确定数据库中的密码不是sha1,而是与md5匹配吗?

于 2013-04-16T20:30:46.537 回答
0

如果您使用 sha1 插入新密码,您也必须在密码比较时使用 sha1。如果将 md5 字符串与 sha1 字符串进行比较,则它不起作用。所以你必须这样做:

$password = sha1($_POST['password']);
于 2013-04-16T20:33:03.837 回答