”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何用 PHP 安全地实现会员专用页面登录系统?

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

发布于2024-11-17
浏览:598

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. Token Generation:现有的令牌生成方法并不安全,因为它使用 openssl_random_pseudo_bytes()。相反,代码应使用加密安全随机数生成器 (CSPRNG),如 random_bytes()。

建议的解决方案

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

改进的代码

以下修订后的代码解决了已识别的问题并提供了更安全的成员-仅页面登录系统:

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();
?>
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3