使用 BCrypt 的 PHP 登录身份验证

标签 php mysql sql pdo bcrypt

<分区>

所以我有一个 php 身份验证脚本,一切正常。但是我对我编程的方式非常不确定(我硬编码了一些东西)并且我希望堆栈可以检查它并指出任何潜在的问题。

这是脚本:

<?php
require_once 'Bcrypt.php';
class Mysql {
    private $conn;

    function __construct() {
        $this->conn =  new PDO('mysql:host=***;dbname=***;charset=UTF-8','***','***') or 
                      die('There was a problem connecting to the database.');
    }

    function verify_Username_and_Pass($un, $pwd) {
        ini_set('display_errors', 'On');
        error_reporting(E_ALL | E_STRICT);
        $query = "SELECT *
                FROM Conference
                WHERE Username = :un";

        $stmt = $this->conn->prepare($query);

        $stmt->bindParam(':un', $un);
        //$stmt->bindParam(':pwd', $pwd);
        $stmt->execute();
        $row = $stmt->fetchAll();
        $hash = $row[0]["Password"];
        $is_correct = Bcrypt::check($pwd, $hash);

        if ($is_correct) {
            // User exist
            $firstName = $row[0]["First Name"];
            $_SESSION["FirstName"] = $firstName;
            return true;
            $stmt->close();
        }
        else {
            // User doesn't exist
            return false;
            $stmt->close();
        }
    }
}
?>

那么它看起来怎么样?

最佳答案

未经测试,我认为您的代码应该可以工作,BCrypt 的使用看起来很合理。当然,有些地方可以改进,有些可能是见仁见智。

  1. 如果您的查询没有返回任何行(因为不存在这样的用户名),您将访问无效索引 $row[0]["Password"]。在使用之前,您应该先询问是否有结果。
  2. 关闭数据库的调用放在返回语句之后,因此永远不会执行。 PHP 将自动关闭数据库,因此要么在 return 语句之前关闭它,要么删除该行。
  3. 您将函数命名为 verify_username_and_password(),但实际上它也确实从数据库读取并写入 session 。这些是隐藏的事件,另一个开发人员除非阅读整个代码,否则无法知道 session 发生了变化。解决此问题的一种可能性是拆分功能。

未经测试的例子:

$userRow = getUserRowFromDatabase($userName);
if (!is_null($userRow))
{
  if (verifyPassword($password, $userRow["Password"]))
  {
    addLoggedInUserToSession($userRow["First Name"])
  }
}

这三个功能中的每一个都只有一个问题需要解决。这将使您的代码更具可读性,理想情况下它应该像阅读书中的故事一样。

希望我能给你一些想法。

关于使用 BCrypt 的 PHP 登录身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12733753/

相关文章:

php - Memcached - 为什么不存储数据?

php - 如果有多个结果,则对数据库中一个字段的值进行排名,并仅返回排名最高/最低的值

MySQL:当表中有2个 `Unique Key`时,是否必须创建 `Primary Keys`?

php - SQLSTATE[23000] : Integrity constraint violation: 1048 Column 'user_id' cannot be null error when assign forien key value?

mysql - 如何在 SQL 中找到列的模式?

Mysql - 如何查询列中的重复值但在不同的列中有不同的值?

php - 使用 mySQL 每天获取新的表数据

php - 先解析php再解析asp.net

sql - 一个奇怪的 CREATE EXTENSION WITH postgres 错误

php - 如何在 laravel 4 框架中应用 xss 过滤器?