这是使用PHP MySQL提高用户访问级别的安全方法吗?

问题描述 投票:-1回答:1

我正在用PHP创建用户访问级别。我写了一些它工作的代码,并将用户重定向到各自的页面,但我不确定这是否是一种安全的方式。

if(filter_has_var(INPUT_POST, "signin")){
    $firstname = $_POST["firstname"];
    $password_1 = $_POST["password_1"];

    $sql = "SELECT * FROM users WHERE firstname = :firstname";
    $stmt = $conn->prepare($sql);
    $stmt->execute(["firstname" => $firstname]);
    $res = $stmt->fetch();
    $password = $res["password_1"];

    if(password_verify($password_1, $password)){
        // USER ACCESS LEVEL
        if($res["user_type"] == "student"){
            $_SESSION["username"] = $firstname;
            header("location: index_s.php?type=student");
        } else if ($res["user_type"] == "teacher"){
            $_SESSION["username"] = $firstname;
            header("location: index_t.php");
        } else {
            $_SESSION["username"] = $firstname;
            header("location: index.php");
        }
    } else {
        array_push($errors, "Invalid username/password entered!");
    }
}

我的用户表中有一个user_type列,其中用户在注册时识别他是哪种类型的用户,并且基于他们在登录时被重定向到各自的页面。但是,这段代码有效,但我认为这不是正确的这样做的方式。我需要您的帮助和反馈,以提高我的代码质量。我也是编程新手请说清楚。

php pdo
1个回答
-1
投票

安全是一个很大的话题,甚至主要的网站都被黑了。

这就是说我认为你的解决方案不安全,因为你在数据库中存储了普通密码。

此外,您可以在一个查询中完成所有操作。就像是:

$firstname = trim($_POST["firstname"]);
$password  = plain_password_to_hash(trim($_POST["password"])); // Important!

$sql = "SELECT id, user_type FROM users WHERE firstname = :firstname AND password = :password";
$stmt = $conn->prepare($sql);
$stmt->execute(["firstname" => $firstname, "password" => $password]);
$res = $stmt->fetch();

// If $res is empty, the combination of firstname and password wasn't found.

有关密码安全,请阅读:

  1. https://secure.php.net/manual/en/function.password-hash.php
  2. https://secure.php.net/manual/en/function.password-verify.php
© www.soinside.com 2019 - 2024. All rights reserved.