创建博客但mysql php密码问题

时间:2014-05-28 19:20:00

标签: php mysql blogs

我正在使用mysql和php从头创建一个博客。

class.user.php代码:

    <?php

class User{

private $db;
public function __construct($db){
$this->db = $db;
}


public function is_logged_in(){
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){
return true;
}   
}

public function create_hash($value)
{
return $hash = crypt($value, '$2a$12$'.substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22));
}

private function verify_hash($password,$hash)
{
return $hash == crypt($password, $hash);
}

private function get_user_hash($username){  

try {

//echo $this->create_hash('demo');

$stmt = $this->db->prepare('SELECT password FROM blog_members WHERE username = :username');
$stmt->execute(array('username' => $username));
$row = $stmt->fetch();
return $row['password'];

} catch(PDOException $e) {
echo '<p class="error">'.$e->getMessage().'</p>';
}
}

public function login($username,$password){ 

$hashed = $this->get_user_hash($username);
if($this->verify_hash($password,$hashed) == 1){
$_SESSION['loggedin'] = true;
return true;
}   
}
public function logout(){
session_destroy();
}
}

?>

连接到class.user.php的Login.php

    <?php
//include config
require_once('../includes/config.php');


//check if already logged in
if( $user->is_logged_in() ){ header('Location: index.php'); }
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Admin Login</title>
<link rel="stylesheet" href="../style/normalize.css">
<link rel="stylesheet" href="../style/main.css">
</head>
<body>

<div id="login">

<?php

//process login form if submitted
if(isset($_POST['submit'])){

$username = trim($_POST['username']);
$password = trim($_POST['password']);
if($user->login($username,$password)){

//logged in return to index page
header('Location: index.php');
exit;

} else {
$message = '<p class="error">Wrong username or password</p>';
}

}//end if submit

if(isset($message)){ echo $message; }
?>

<form action="" method="post">
<p><label>Username</label><input type="text" name="username" value="" /></p>
<p><label>Password</label><input type="password" name="password" value="" /></p>
<p><label></label><input type="submit" name="submit" value="Login" /></p>
</form>

</div>
</body>
</html>

我使用phpmyAdmin创建了表但是我尝试登录,它说错误的用户名和密码。我不能让它工作。还有其他解决方法或其他方法吗?

由于

2 个答案:

答案 0 :(得分:1)

有几件事......

为什么重新发明轮子?

除非这是一项获取知识的练习,否则当有大量现成的现成解决方案可以满足您的需求时,创建自己的博客系统会有点极端。

回到你的问题......

为帐户创建用户密码时,需要将salt与散列密码一起存储在数据库中。然后,当您检查身份验证时,您将从数据库中获取salt和哈希密码。然后,使用现有salt对提交的密码进行哈希处理,并检查它是否与数据库中的哈希密码匹配。

您目前正在做的是从数据库中获取哈希密码,然后将其与crypt($password, $db_password)进行比较 - 这基本上意味着您使用db中的现有哈希密码对用户提交的密码进行哈希处理,这当然永远不会匹配。

答案 1 :(得分:0)

可能的答案:

我建议你重新阅读crypt()上的文档,(他们建议先使用password_hash()而不是crypt()):http://us3.php.net/manual/en/function.crypt.php 另外,据我所知,包括时间敏感的盐意味着你必须有相同的时间来匹配哈希...如果你在数据库中记录创建日期(作为时间戳),你可以肯定然后,根据我的理解,它绝对不会工作...记住哈希意味着以一种非常安全的方式加密特定值很难找到那个价值。但是,只要您使用最初创建哈希的SAME特定值,生成与旧哈希匹配的新哈希就很容易......我理解它,包括相同的盐。

评论trim():

我必须支持@WesleyMurch,绝对不要修改密码...我有一些边缘情况的经验,我可以看到在密码上使用trim()的默认功能可能很有价值。在非常具体的需求和条件下,只要用户非常清楚您将通过从密码的开头或结尾删除空格来修改密码。我实际上有一个密码,我不小心包含了一个空格&amp;艰难的回归...花了一段时间才弄清楚那一个(我正在复制并从密码管理器粘贴)。 我也必须在他的评论中支持@TheBlueDog,我的经验可能不是一个非常可能的情况。 大多数情况下,如果您的密码由于无意的空白区域而无法正常工作,您将无法知道原因,并且您将重置密码,因此可以解决问题。 此外,许多人仍然不使用密码管理器,可能不会经常复制&amp;粘贴密码。

祝你好运!