1

I've created a login script where I am simply trying to match the username and password that is passed through my login form, create a session and pass through session variables and redirect the user to a different page.

I'm using an OOP PDO approached style as this is the way forward and it is a lot simpler to code.

When registering a user I encrypt the password using the PHP crypt method. However when I try to login my statement is returned as false and to be fair I don't know what I am doing wrong, perhaps I'm decrypting the password incorrectly, I'm not sure.

When I say false I mean my if statement echo's

Invaild username or password. Try again

Any help or ideas greatly welcomed and appreciated, thank you in advance.

index.php

<form id="loginForm" method="POST" action="classes/class.Login.php">
<input type="text" id="username" name="username" placeholder="Username"/>
<input type="password" id="password" name="password" placeholder="Password" class="showpassword"/> 
<input type="submit" name="submit" value="Log in"/>

classes/class.Login.php

public function loginuser() {

 $username = $_POST['username'];
 $password = $_POST['password'];

 $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1");
 $stmt->bindValue(":username", $username);
 $stmt->bindValue(":password", crypt($password));
 $stmt->execute();
 if ($stmt->fetch())
 {
    $_SESSION['authorized'] = true;
    $_SESSION['username'] = $username;
    header("Location: testloginrequired.php");
  }
  else
  {
    echo "Invaild username or password. Try again";
   }
}// end loginuser
4

3 回答 3

3

正如@Nambi 建议的那样,如果您要使用crypt()您将需要使用可选参数 Salt,否则它将返回不同的结果,这就是它永远不匹配的原因。

echo crypt('foo');
echo crypt('foo');
echo crypt('foo');

返回:

$1$rnmZxKr0$V7lk8JZ0tV1Utb78hH0g.0
$1$v84YR6KA$Xl5QvouObIZqWvxEIQwO/.
$1$expSZHgb$HAZ9ydKmjQcmwLeLDxjO41


echo crypt('foo', 'bar');
echo crypt('foo', 'bar');
echo crypt('foo', 'bar');

返回:

ba4TuD1iozTxw
ba4TuD1iozTxw
ba4TuD1iozTxw


显然,如果您想要更多控制,最好隐藏盐而不是使用普通盐或让它自动生成。

注册用户时,您必须存储生成的盐。
检查登录时,您会得到盐,并将其与用户输入的密码一起使用来 crypt() 它,并检查使用该盐的加密密码是否与数据库中的密码匹配。

注意:为了安全起见,这是显而易见的,但以防万一:为每个密码生成不同的盐,如果您使用相同的盐,如果一个密码被黑客入侵,那么黑客将知道所有其他密码的盐,使他的生活更轻松。


正如@Nabil 建议你更好地研究一下你将使用什么加密,因为以后会很痛苦地改变它。

我个人喜欢河豚

避免使用 MD5 和 SHA1,它们曾经被认为是安全的,但随着技术的发展,它不再是安全的,即使在 php 文档的相应页面上,用户也警告新用户不要使用它们。

于 2013-09-24T08:56:08.183 回答
2

那是因为crypt('something')每次都返回不同的值。

使用ripemd

<?php
echo hash('ripemd160', 'password');
?>
于 2013-09-24T08:41:58.070 回答
-2

如果您存储在 mysql 数据库中,请尝试 sha1() 而不是 crypt()

于 2013-09-24T08:44:18.410 回答