Position actuelle: Accueil> Derniers articles> Utilisez MySQLI :: STMT_INIT pour implémenter un mécanisme de vérification de connexion sécurisé

Utilisez MySQLI :: STMT_INIT pour implémenter un mécanisme de vérification de connexion sécurisé

M66 2025-06-06

Lors du développement de sites Web PHP, la fonction de connexion de l'utilisateur en fait presque partie intégrante. Cependant, si l'entrée de l'utilisateur est traitée accidentellement, elle est vulnérable aux attaques d'injection SQL. MySQLI :: STMT_INIT est une méthode fournie par l'extension MySQLI , qui peut être effectivement empêchée d'injection SQL avec des instructions de prétraitement. Cet article utilisera un exemple spécifique pour décrire comment l'utiliser pour implémenter un mécanisme d'authentification de connexion sécurisé.

Pourquoi empêcher l'injection SQL?

L'injection SQL est une technologie d'attaque dans laquelle un attaquant tamponne la logique de requête d'origine en injectant des instructions SQL malveillantes dans le champ de saisie. Par exemple, si vous épissez directement SQL:

 $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

Un attaquant peut entrer «ou« 1 »= '1 comme nom d'utilisateur ou mot de passe, de sorte que la requête est toujours vraie et contourner l'authentification.

Le rôle de MySqli :: STMT_INIT et des déclarations de prétraitement

MySQLI :: STMT_INIT est utilisé pour initialiser un objet mysqli_stmt . Il s'agit de la première étape de la mise en œuvre des instructions de prétraitement. Il peut strictement distinguer SQL de l'entrée de l'utilisateur, empêchant ainsi efficacement les attaques d'injection.

Exemple de code: vérification de la connexion sécurisée

Voici un exemple de vérification du formulaire de connexion sécurisé:

 <?php
// Connexion de base de données
$mysqli = new mysqli("localhost", "db_user", "db_password", "my_database");

// Vérifiez la connexion
if ($mysqli->connect_errno) {
    die("Échec de la connexion: " . $mysqli->connect_error);
}

// Nom d&#39;utilisateur et mot de passe de soumission des utilisateurs
$username = $_POST['username'];
$password = $_POST['password'];

// Initialiser un objet de déclaration de prétraitement
$stmt = $mysqli->stmt_init();

// écrire SQL Déclaration de requête,utiliser ? Espace réservé
$sql = "SELECT id, password_hash FROM users WHERE username = ?";

// Déclaration de préparation
if ($stmt->prepare($sql)) {
    // Lier les paramètres(s exprimer string taper)
    $stmt->bind_param("s", $username);

    // Instruction d&#39;exécution
    $stmt->execute();

    // Obtenir des résultats
    $stmt->bind_result($user_id, $password_hash);

    // Déterminez s&#39;il y a un résultat
    if ($stmt->fetch()) {
        // Vérifier le mot de passe(Supposons que la base de données est stockée password_hash() Résultats)
        if (password_verify($password, $password_hash)) {
            echo "Connectez-vous avec succès,Utilisateurs de bienvenue ID:$user_id";
            // Configurer une session ou sauter,Par exemple:
            // header("Location: https://m66.net/dashboard.php");
        } else {
            echo "Mot de passe d&#39;erreur";
        }
    } else {
        echo "Le nom d&#39;utilisateur n&#39;existe pas";
    }

    // Déclaration étroite
    $stmt->close();
} else {
    echo "SQL La préparation de la déclaration a échoué: " . $mysqli->error;
}

// Fermer la connexion
$mysqli->close();
?>

résumé

En utilisant Bind_param avec MySQLI :: STMT_INIT avec des instructions de prétraitement, nous pouvons effectivement empêcher les attaques d'injection SQL. Les instructions de prétraitement doivent toujours être utilisées dans le développement pour traiter la saisie des utilisateurs, en particulier lorsque les opérations de base de données sont impliquées. De plus, des fonctions telles que Mord_Hash () et Password_Verify () doivent être utilisées pour améliorer la sécurité du mot de passe.

Si vous créez un système de connexion ou un module d'authentification utilisateur, utilisez d'abord cette méthode, ce qui est beaucoup plus sûr que l'épissage traditionnel de chaîne.