Maison  >  Article  >  développement back-end  >  **Pourquoi mon script de connexion MySQL ne fonctionne-t-il pas ?**

**Pourquoi mon script de connexion MySQL ne fonctionne-t-il pas ?**

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 07:15:02953parcourir

**Why is my MySQL login script not working?**

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 :

  • 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn