為什麼我的登入表單無法連線到我的 MySQL 資料庫?

Mary-Kate Olsen
發布: 2024-10-25 11:13:02
原創
735 人瀏覽過

Why is My Login Form Not Connecting to My MySQL Database?

無法將登入表單連接到 MySQL 資料庫

此查詢涉及實現根據 MySQL 資料庫進行驗證的使用者登入功能。使用者期望輸入使用者名稱和密碼,該使用者名稱和密碼應根據資料庫中儲存的憑證進行驗證。不幸的是,雖然表單提交沒有錯誤,但並沒有實現想要的功能。

解決問題

這個問題的根本原因在於缺乏針對 SQL 注入攻擊的保護以及不安全在資料庫中以純文字形式儲存密碼。為了解決這些問題,建議:

  • 使用準備好的語句:參數化使用者輸入以防止 SQL 注入攻擊。不是直接將使用者輸入嵌入到 SQL 查詢中,而是使用佔位符,並將參數綁定到這些佔位符。
  • 實現正確的密碼雜湊:使用單向雜湊函數安全地儲存密碼,例如bcrypt 或 PBKDF2。這可以防止未經授權的使用者在資料外洩時存取明文密碼。

程式碼解決方案(使用準備好的語句和密碼雜湊)

Register.php:

<code class="php">// Replace previous code with the following:

session_start();

if (isset($_SESSION['userid'])) {
    // Redirect to safe page
}

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

    // New code for password hashing
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    // Database connection and query
    $host = "localhost";
    $dbname = "database_name";
    $user = "username";
    $pass = "password";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        $stmt = $conn->prepare("INSERT INTO user_accounts (email, password) VALUES (?, ?)");
        $stmt->execute([$email, $hashed_password]);
        
        // Redirect to login page
        
        $conn = null;
    } catch (PDOException $e) {
        throw $e;
    }
}</code>
登入後複製

Login.php:

<code class="php">// Replace previous code with the following:

session_start();

if (isset($_SESSION['userid'])) {
    // Redirect to safe page
}

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

    // Database connection and query
    $host = "localhost";
    $dbname = "database_name";
    $user = "username";
    $pass = "password";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Get hashed password from database
        $stmt = $conn->prepare("SELECT password FROM user_accounts WHERE email = ?");
        $stmt->execute([$email]);
        $hashed_db_password = $stmt->fetchColumn();

        if (password_verify($password, $hashed_db_password)) {
            // User authenticated successfully
            $_SESSION['userid'] = true;
            
            // Redirect to safe page
        } else {
            // Authentication failed
        }
        
        $conn = null;
    } catch (PDOException $e) {
        throw $e;
    }
}</code>
登入後複製

透過這些程式碼修改,使用者登入現在應該透過與MySQL 資料庫安全互動來正常運行,從而防止SQL注入攻擊和使用者密碼外洩。

以上是為什麼我的登入表單無法連線到我的 MySQL 資料庫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!