**為什麼我的 MySQL 登入腳本不起作用?
我的登入腳本中的 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip
