Quel est le problème avec ma connexion MySQL dans mon script de connexion ?
Dans les fragments de code fournis, il semble y avoir plusieurs domaines qui pourrait causer des problèmes avec le formulaire de connexion. Passons-les un par un :
1. Connexion à la base de données :
Dans le fichier PHP login.php, vous tentez d'établir une connexion à la base de données à l'aide du code suivant :
<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>
Cependant, vous avez codé en dur les informations d'identification de la base de données. Ce n'est pas une bonne pratique de coder en dur ces détails dans le code, car ils pourraient changer à l'avenir. Au lieu de cela, il est recommandé de séparer les informations d'identification de la base de données dans un fichier de configuration et de les lire à partir de là pour garantir une meilleure sécurité et flexibilité.
2. Déclaration préparée :
Dans register.php et login.php, vous préparez les instructions SQL à l'aide de la fonction mysqli_prepare. Cependant, vous ne les exécutez pas ensuite en utilisant mysqli_stmt_execute. Cela empêchera l'exécution de la requête et entraînera un échec de connexion ou d'enregistrement.
3. Paramètres de liaison :
Lorsque vous utilisez la fonction mysqli_stmt_bind_param, vous devez fournir les types des paramètres liés. Dans register.php et login.php, vous liez les paramètres en utilisant le type "s", qui concerne les chaînes. Toutefois, si vous liez des valeurs entières, vous devez utiliser le spécificateur de type approprié, tel que « i » pour les entiers.
4. Authentification de l'utilisateur :
Dans login.php, lors de la vérification du mot de passe de l'utilisateur, vous comparez le mot de passe en clair ($ctPassword) directement au mot de passe haché stocké dans la base de données ($dbHashedPassword). Il s'agit d'un risque de sécurité, car cela permet à l'attaquant d'accéder au mot de passe de l'utilisateur s'il parvient à intercepter la demande. Au lieu de cela, vous devez utiliser la fonction password_verify pour comparer les mots de passe hachés en toute sécurité.
5. Gestion de session :
Vous utilisez le superglobal $_SESSION pour stocker l'identifiant de l'utilisateur lors d'une connexion réussie. Cependant, vous ne démarrez pas la session en utilisant session_start() dans login.php. Cela empêchera la session d'être correctement initialisée et les données de la session ne seront pas disponibles.
6. Injection SQL :
Vous n'utilisez pas d'instructions préparées lors de l'exécution de vos requêtes SQL, ce qui rend votre code vulnérable aux attaques par injection SQL. Vous devez toujours utiliser des instructions préparées pour empêcher ce type d'attaque.
Voici quelques fragments de code mis à jour qui résolvent ces problèmes :
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>
Notes supplémentaires :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!