PHP中的Password_verify

时间:2015-07-27 23:08:02

标签: php mysql password-hash

所以我允许用户使用用户名和密码创建帐户。当用户使用以下方法创建新帐户时,我已设法加密密码:

$hash = password_hash($password, PASSWORD_BCRYPT);

但是登录时我遇到了password_verify的问题,有人可以帮我解决一下我的问题吗?我知道它是这样的:

password_verify($password, $hash)

但我不知道如何构造它或在代码中添加它的位置。提前致谢。这就是我所拥有的:

<?php
if (isset($_GET["username"])  && isset($_GET["password"]) ){
    $username = $_GET["username"];
    $password = $_GET["password"];
    $result = login( $username, $password);
    echo $result;
}

function makeSqlConnection()
{
    $DB_HostName = "";
    $DB_Name = "";
    $DB_User = "";
    $DB_Pass = "";

    $con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error()); 

    mysql_select_db($DB_Name,$con) or die(mysql_error()); 

    return $con;
}

function disconnectSqlConnection($con)
{
    mysql_close($con);
}

function login($username, $password)
{
    $con = makeSqlConnection();
    $sql = "select * from login  where username = '$username' and password = '$password';";
    $res = mysql_query($sql,$con) or die(mysql_error());

    $res1 = mysql_num_rows($res);

    disconnectSqlConnection($con);

     if ($res1 != 0) {
        return 1;
    }else{
        return 0;
    }// end else

}// end of Function 
?>

2 个答案:

答案 0 :(得分:1)

一般做法如下:

  1. var _viewController:UITableViewController! var flag = 0 func filter(sender: UIButton){ if(flag == 1){ _viewController.willMoveToParentViewController(nil) _viewController.view.removeFromSuperview() _viewController.removeFromParentViewController() flag = 0 return } addChildViewController(_viewController) _viewController.view.frame.origin.y = filterButton.frame.maxY _viewController.view.frame.origin.x = self.view.frame.size.width-250 _viewController.view.frame.size.width = 250 _viewController.view.frame.size.height = 500 self.view.addSubview(_viewController.view) _viewController.didMoveToParentViewController(self) flag = 1 } override func viewDidLoad() { super.viewDidLoad() _viewController = storyboard!.instantiateViewControllerWithIdentifier("UserViewController") as! UserViewController } =输入的用户名的数据库中获取password哈希。
  2. 如果找到了行,则会有用户
  3. 现在将输入的密码与存储在数据库中的哈希进行比较。
  4. 我将在这里为您提供一些伪代码概述上述流程:

    username

    备注

    • 停止使用$query = SELECT password FROM users WHERE username = '$username' $data = FETCH_THE_DATA($query); if(password_verify($USER_INPUTTED_PASSWORD, $data['password'])) { // password is correct } else { // password is in-correct } 个功能。该库已弃用,因为它不可靠,将在以后的PHP版本中删除。
    • 您应该一直阅读手册 - password_verify(),它清楚地表明您比较用户输入的密码&#34;针对存储在数据库中的散列版本。

答案 1 :(得分:0)

由于我今天感觉很好,很困,我会写一堆代码。

这是如何将PDO与预准备语句一起使用的示例。你必须根据你的需要调整它,你必须检查post / get是否也是空的。 我更喜欢使用POST请求登录,所以这个例子将使用POST请求..

这是我的用户类。哪个使用占位符和绑定而不是直接将参数传递给查询。这将对SQL注入攻击提供一些保护。

class User{

    private $dbh;


    function __construct(){

        $this->dbh = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD) or die('db connect error');
    }


    function create($username, $password){

        $status = false;

        try{

            $stmt = "INSERT INTO login (username, password)
                        VALUES (?, ?)";

            $qry = $this->dbh->prepare($stmt);

            $qry->bindParam(1, $username);
            $qry->bindParam(2, $password);

            $status = $qry->execute();
        }catch(PDOException $e){

            $e->getMessage();
        }

        $qry->closeCursor();

        return $status;        

    }

    public function getPassword($username){

        $status = false;
        try{
            $stmt = "SELECT * FROM login WHERE username = ? LIMIT 1";

            $qry = $this->dbh->prepare($stmt);
            $qry->bindParam(1, $username);
            $qry->execute();

            $status = $qry->fetch(PDO::FETCH_ASSOC);
        }catch(PDOException $e){

            $e->getMessage();
        }
        $qry->closeCursor();

        return $status;
    }    

}

这是如何创建用户。请注意,我不检查用户名是否已存在。您可以自己实现它,也可以在用户名列上使用唯一索引,前提是排序规则不区分大小写。 我还增加了默认值10的成本,我定义了PASSWORD_DEFAULT,因为我希望PHP引擎始终使用最强的可用算法(目前是bcrypt)。

function hashPassword($password){

            $password = password_hash($password, PASSWORD_DEFAULT,array('cost' => 16));
            return $password;
}

$user = new User;
$_POST['password'] = hashPassword($_POST['password']);


if(!$user->create(trim($_POST['username']),$_POST['password'])){

    echo 'Failed creating user';
}else{
    echo 'User created';
}

这是验证密码的方法。

$user = new User;
$getPassword = $user->getPassword(trim($_POST['username']));

if(!$getPassword){

    echo 'Error fetching user';
}else{

    if(!password_verify($_POST['password'], $getPassword['password'])){

        echo 'Login failed';
    }else{

        echo 'Login successful';        
    }
}