首頁  >  文章  >  資料庫  >  如何用 PHP 安全地實現會員專用頁面登入系統?

如何用 PHP 安全地實現會員專用頁面登入系統?

Barbara Streisand
Barbara Streisand原創
2024-11-23 13:21:12833瀏覽

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