首頁  >  文章  >  後端開發  >  **為什麼我的 MySQL 登入腳本不起作用?

**為什麼我的 MySQL 登入腳本不起作用?

Susan Sarandon
Susan Sarandon原創
2024-10-26 07:15:02953瀏覽

**Why is my MySQL login script not working?**

我的登入腳本中的 MySQL 連線有什麼問題?

在提供的程式碼片段中,似乎有幾個區域可能會導致登入表單出現問題。讓我們一一瀏覽:

1。資料庫連線:

在 PHP 檔案 login.php 中,您嘗試使用下列程式碼建立與資料庫的連線:

<code class="php">// Pretend the following is locked in a vault and loaded but hard coded here
$hostname = "localhost";
$database = "boost";
$username = "root";
$password = "";
$localhost = mysqli_connect($hostname, $username, $password, $database);

if (mysqli_connect_errno()) {
    die("Connection Failed" . mysqli_error());
}</code>

但是,您已硬編碼資料庫憑證。在程式碼中硬編碼這些細節並不是一個好的做法,因為它們將來可能會改變。相反,建議在設定檔中分離資料庫憑證並從那裡讀取它們,以確保更好的安全性和靈活性。

2.準備好的語句:

在register.php和login.php中,您使用mysqli_prepare函數來準備SQL語句。但是,您之後不會使用 mysqli_stmt_execute 執行它們。這將阻止執行查詢並導致登入或註冊失敗。

3.綁定參數:

使用 mysqli_stmt_bind_param 函數時,應提供綁定參數的型別。在register.php和login.php中,您都使用「s」類型(用於字串)綁定參數。但是,如果您要綁定整數值,則應使用適當的類型說明符,例如表示整數的“i”。

4.使用者驗證:

在login.php中,驗證使用者密碼時,您將明文密碼($ctPassword)直接與儲存在資料庫中的雜湊密碼($dbHashedPassword)進行比較。這是一個安全風險,因為攻擊者可以攔截請求,從而獲得對使用者密碼的存取權。相反,您應該使用password_verify 函數來安全地比較雜湊密碼。

5.會話處理:

您使用 $_SESSION 超全域變數來儲存成功登入後的使用者 ID。但是,您不使用login.php 中的session_start() 來啟動會話。這將導致會話無法正確初始化,並且會話資料將不可用。

6. SQL 注入:

執行 SQL 查詢時沒有使用準備好的語句,這使您的程式碼容易受到 SQL 注入攻擊。您應該始終使用準備好的語句來防止此類攻擊。

以下是一些解決這些問題的更新程式碼片段:

register.php:

<code class="php">session_start();

if (isset($_POST['register'])) {
    $email = $_POST['email'];
    $ctPassword = $_POST['password'];   // Cleartext password from user

    // Pretend the following is locked in a vault and loaded but hard coded here
    $host = "yourhostname";
    $dbname = "dbname";
    $user = "dbuser";
    $pwd = "password";
    $port = 3306; // Comes along for the ride so I don't need to look up param order below

    try {
        $mysqli = new mysqli($host, $user, $pwd, $dbname, $port);

        if ($mysqli->connect_error) {
            die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
        }

        $query = "INSERT INTO user_accounts2(email, password) VALUES (?, ?)";
        $stmt = $mysqli->prepare($query);

        $hp = password_hash($ctPassword, PASSWORD_DEFAULT); // Hashed password using cleartext one

        $stmt->bind_param("ss", $email, $hp);
        $stmt->execute();

        $iLastInsertId = $mysqli->insert_id;
        $stmt->close();
        $mysqli->close();
    } catch (mysqli_sql_exception $e) {
        throw $e;
    }
}</code>

login.php:

<code class="php">session_start();

if (isset($_POST['login'])) {
    $email = $_POST['email'];
    $ctPassword = $_POST['password'];   // Cleartext password from user

    // Pretend the following is locked in a vault and loaded but hard coded here
    $host = "yourhostname";
    $dbname = "dbname";
    $user = "dbuser";
    $pwd = "password";
    $port = 3306;

    try {
        $mysqli = new mysqli($host, $user, $pwd, $dbname, $port);

        if ($mysqli->connect_error) {
            die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
        }

        $query = "SELECT id, email, password FROM user_accounts2 WHERE email = ?";
        $stmt = $mysqli->prepare($query);

        $stmt->bind_param("s", $email);
        $stmt->execute();

        $result = $stmt->get_result();

        if ($row = $result->fetch_array(MYSQLI_ASSOC)) {
            $dbHashedPassword = $row['password'];
            if (password_verify($ctPassword, $dbHashedPassword)) {
                echo "Right, userId=";
                $_SESSION['userid'] = $row['id'];
                echo $_SESSION['userid'];
            } else {
                echo "Wrong";
            }
        } else {
            echo 'No such record';
        }

        $stmt->close();
        $mysqli->close();
    } catch (mysqli_sql_exception $e) {
        throw $e;
    }
}</code>

附加說明:

  • 強烈建議使用 PDO 或 Doctrine 等資料庫抽象層 (DAL) 來簡化資料庫互動。
  • 切勿在資料庫中以明文形式儲存密碼。始終使用 bcrypt 或 Argon2 等強大的雜湊演算法對它們進行安全雜湊處理。
  • 使用準備好的語句來防止 SQL 注入攻擊。
  • 在將使用者輸入提交到資料庫之前驗證使用者輸入以防止惡意攻擊。
  • 考慮使用更強大的安全框架來保護您的應用程式免受各種類型的攻擊。

以上是**為什麼我的 MySQL 登入腳本不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn