我的登入腳本中的 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>
附加說明:
以上是**為什麼我的 MySQL 登入腳本不起作用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!