首页  >  文章  >  数据库  >  如何用 PHP 安全地实现会员专用页面登录系统?

如何用 PHP 安全地实现会员专用页面登录系统?

Barbara Streisand
Barbara Streisand原创
2024-11-23 13:21:12834浏览

How to Securely Implement a Member-Only Page Login System in PHP?

PHP:使用登录系统保护会员专用页面

提供的代码面临的挑战

提供的 PHP 代码遇到了几个阻碍其实现的问题功能:

  1. 检索查询结果:不要使用 $data1 = $conn->query($sql1);,正确的方法是使用 $data = mysqli_fetch_array($conn->query($sql1));或 $data = $conn->query($sql1)->fetch_array();获取查询结果。
  2. 数据库连接和执行:应使用 $total = $data = 0 建立与数据库的连接;在执行任何查询之前。
  3. MySQLi 语法:插入标记的查询应在表名和列名周围使用反引号 () (INSERT INTO tokens (tk, gauth) VALUES (?,? )`) 而不是单引号。
  4. 用户身份验证:身份验证逻辑应该返回查询结果,而不是依赖布尔值 ($result = $conn->query($sql3)->fetch_array();)。
  5. 令牌生成:现有的令牌生成方法并不安全,因为它使用 openssl_random_pseudo_bytes()。相反,代码应该使用加密安全随机数生成器 (CSPRNG),如 random_bytes()。

建议的解决方案

  1. 简化数据库操作:使用单个查询检索用户信息并检查凭据。
  2. 使用Prepared语句:绑定参数以防止SQL注入漏洞。
  3. 安全地生成令牌:使用random_bytes()或类似函数来安全生成令牌。
  4. 将身份验证数据存储在会话中:将身份验证令牌保存在会话变量中,而不是保存在会话变量中cookie。
  5. 验证令牌:对令牌表执行数据库查询以验证提供的令牌。

改进的代码

以下内容修订后的代码解决了已发现的问题,并提供了更安全的会员专用页面登录系统:

<?php
    session_start();
    error_reporting(0);

    $servername = "localhost";
    $username = "root20";
    $password = "jjewett38";
    $db = "vws";

    // Create connection
    $total = $data = 0;
    $conn = new mysqli($servername, $username, $password, $db);

    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }

    // Prepare statement for user authentication
    $sql_auth = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
    $sql_auth->bind_param("ss", $_POST['uname'], $_POST['pss']);
    $sql_auth->execute();
    $result_auth = $sql_auth->get_result();

    // Authenticate user
    if ($result_auth->num_rows > 0) {
        $user = $result_auth->fetch_assoc();
        $correct = TRUE;
    } else {
        $correct = FALSE;
    }

    // Generate token
    if ($correct === TRUE) {
        $hex = bin2hex(random_bytes(3));
        $_SESSION['auth'] = $hex;
        $_SESSION['logstat'] = TRUE;
    }

    // Close connection
    $conn->close();
?>

以上是如何用 PHP 安全地实现会员专用页面登录系统?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn