php密码功能不起作用

时间:2014-11-18 16:53:30

标签: php mysql passwords

在我的网站上,有机会建立用户并登录。我想使用PHP的新密码函数password_hashpassword_verify来提高安全性。在我自己的计算机中,我有PHP 5.5,所以功能正常。但是,在我的webhotel中,有一个版本为5.2的PHP,因此我必须从Github下载密码函数。现在功能不起作用。看起来password_hash没有返回任何内容,因为注册后我在数据库中没有任何内容。

我已经检查了错误日志,但它没有任何相关内容。是的,我error_reportingE_ALL | E_STRICTlog_errors开启,我正在查看正确的文件。

我重复一遍:函数在我的计算机(PHP 5.5)中硬编码时没有任何问题,但不能像下载那样工作(PHP 5.2)。

我的代码:

// model:
public function getUser($email, $pass) {
    $this->search("SELECT * FROM users WHERE email = ?", array($email));
    if($this->countRows() <= 0) {
        return false;
    }
    $row = $this->fetchRow();
    if(!password_verify($pass, $row["password"])) {
        return false;
    }
    if(password_needs_rehash($row["password"], PASSWORD_DEFAULT)) {
        $this->run("UPDATE users SET password = ? WHERE id = ?",array(password_hash($pass,PASSWORD_DEFAULT),$row["id"]));
    }
    return $row;
}

public function userExists($email) {
    $this->search("SELECT * FROM users WHERE email = ?", array($email));
    if($this->countRows() <= 0) {
        return false;
    }
    return true;
}

// sign up
public function reg() {
    if($this->model->userExists($_POST["email"])) {
        header("Location: " . PUBLICROOT . "/index/index/error/emailAlreadyExists");
        die();
    }
    $this->model->run("INSERT INTO users (firstname, lastname, email, password, birthday) VALUES (?,?,?,?,?)", 
            array($_POST["firstname"],$_POST["lastname"],$_POST["email"],
                password_hash($_POST["password"],PASSWORD_DEFAULT),$_POST["birthday"]."-".$_POST["birthmonth"]."-".$_POST["birthyear"]));
    $this->in();
}

// sign in
public function in() {
    $u = $this->model->getUser($_POST["email"],$_POST["password"]);
    if($u === false) {
        header("Location: " . PUBLICROOT . "/index/index/error/signInFailed");
        die();
    } else {
        $_SESSION["userid"] = $u["id"];
        $_SESSION["email"] = $_POST["email"];
        $_SESSION["firstname"] = $u["firstname"];
        $_SESSION["lastname"] = $u["lastname"];
        $_SESSION["time"] = time();
        header("Location: " . PUBLICROOT . "/home/index");
        die();
    }
}

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

可能希望read the README

  

此库需要PHP&gt; = 5.3.7 或将$ 2y修复程序反向移植到其中的版本(例如RedHat提供)。

答案 1 :(得分:2)

  • PHP 5.5提供了使用BCrypt算法的password_hash()函数。
  • 使用PHP 5.3.7,您可以使用compatibility pack
  • 从PHP 5.3开始,可以使用BCrypt(算法&#34; 2a&#34;代替&#34; 2y&#34;)
  • 早期的PHP版本不支持BCrypt,你最好的选择可能是phpass库,尽管它们也有一个不太安全的算法的后备。也许您可以找到一个可以在BCrypt支持的服务器上安装的扩展程序。