


**Pourquoi mon script de connexion MySQL ne fonctionne-t-il pas ?**
Oct 26, 2024 am 07:15 AMQuel 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 :
- Il est fortement recommandé d'utiliser une couche d'abstraction de base de données (DAL) comme PDO ou Doctrine pour simplifier les interactions de votre base de données.
- Ne stockez jamais les mots de passe en texte brut dans votre base de données. Hachez-les toujours en toute sécurité à l'aide d'un algorithme de hachage puissant comme bcrypt ou Argon2.
- Utilisez des instructions préparées pour empêcher les attaques par injection SQL.
- Validez les entrées de l'utilisateur avant de les soumettre à la base de données pour éviter les attaques malveillantes.
- 🎜> Envisagez d'utiliser un cadre de sécurité plus robuste pour protéger votre application contre divers types d'attaques.
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium)

Travailler avec les données de session Flash dans Laravel

Misque de réponse HTTP simplifié dans les tests Laravel

Construisez une application React avec un Laravel Back End: Partie 2, React

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST

12 meilleurs scripts de chat PHP sur Codecanyon
