Position actuelle: Accueil> Derniers articles> Utilisez MySQLI :: Get_Charset pour vérifier le jeu de caractères pour empêcher l'injection SQL

Utilisez MySQLI :: Get_Charset pour vérifier le jeu de caractères pour empêcher l'injection SQL

M66 2025-05-25

Dans le développement Web de PHP, l'injection SQL est une menace de sécurité courante et dangereuse. Afin d'empêcher efficacement l'injection SQL, en plus d'utiliser des instructions préparées, de la liaison des paramètres et d'autres méthodes, s'assurer que le jeu de caractères utilisé par la connexion de la base de données est correct est également un lien important. Cet article se concentrera sur l'utilisation de la fonction MySQLI :: Get_Charset et son rôle dans la prévention de l'injection SQL.

Qu'est-ce que MySQLI :: get_charset ?

MySQLI :: Get_Charset est une méthode fournie par l'extension PHP MySQLI pour obtenir les informations de jeu de caractères de la connexion de la base de données actuelle. Il renvoie un objet contenant des propriétés de jeu de caractères, telles que le nom du jeu de caractères, le codage, etc.

Les ensembles de caractères jouent un rôle important dans la sécurité de la base de données, car si les ensembles de caractères ne sont pas correctement définis, un attaquant peut utiliser des différences de codage pour contourner la validation d'entrée ou construire des charges utiles d'injection spéciales.

Par exemple, MySQL utilise le codage latin1 par défaut. Si le client soumet des données UTF8 mais que le serveur utilise Latin1 pour l'analyser, des caractères inattendus peuvent se produire, entraînant une injection SQL.

Comment vérifier le jeu de caractères à l'aide de mysqli :: get_charset ?

Regardons d'abord un exemple de base:

 <?php
$mysqli = new mysqli("localhost", "user", "password", "database");

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

// Obtenir des informations sur le jeu de caractères
$charsetInfo = $mysqli->get_charset();

echo "Le jeu de caractères utilisé par la connexion actuelle: " . $charsetInfo->charset;
?>

Ce script sort le jeu de caractères de la connexion de la base de données actuelle, telle que UTF8MB4 . C'est une bonne habitude de s'assurer d'utiliser UTF8MB4 au lieu de UTF8 , car UTF8 est en fait un codage de trois octets dans MySQL et ne prend pas en charge tous les caractères Unicode, tandis que UTF8MB4 est l'encodage complet de quatre octets UTF-8.

Pourquoi les jeux de caractères sont-ils importants pour empêcher l'injection de SQL?

Les ensembles de caractères affectent la façon dont le serveur comprend et traite les données envoyées par le client. Si la connexion de la base de données utilise Latin1 mais que les données d'entrée contiennent des caractères multiples, certaines séquences d'octets peuvent être mal comprises comme des caractères de contrôle SQL (tels que des citations simples, des demi-colons), provoquant l'injection SQL.

En utilisant Get_Charset dans le programme pour vérifier si la connexion est un jeu de caractères sûr ( UTF8MB4 est recommandé), le risque d'attaques causées par le décrochage de l'inadéquation peut être considérablement réduit.

Combat pratique: comment utiliser Get_Charset et la protection de la sécurité en combinaison?

Le code suivant montre un scénario complet:

 <?php
$mysqli = new mysqli("localhost", "user", "password", "database");

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

// Vérifiez le jeu de caractères
$charsetInfo = $mysqli->get_charset();
if ($charsetInfo->charset !== 'utf8mb4') {
    // Forcé de utf8mb4
    if (!$mysqli->set_charset("utf8mb4")) {
        die("Impossible de définir le jeu de caractères: " . $mysqli->error);
    }
    echo "Le jeu de caractères a été mis à jour pour utf8mb4\n";
} else {
    echo "Le jeu de caractères actuel est utf8mb4\n";
}

// Empêcher l&#39;injection à l&#39;aide de déclarations de prétraitement
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");
if (!$stmt) {
    die("Le prétraitement a échoué: " . $mysqli->error);
}

// Simulez la valeur obtenue à partir de l&#39;entrée utilisateur
$userInput = $_GET['email'] ?? '';

// Lier les paramètres et exécuter
$stmt->bind_param("s", $userInput);
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    echo "nom d&#39;utilisateur: " . htmlspecialchars($row['username']) . "\n";
}

$stmt->close();
$mysqli->close();
?>

Dans cet exemple, nous utilisons non seulement Get_Charset pour vérifier le jeu de caractères, mais utilisons également set_charset pour garantir la sécurisation de la connexion. Ensuite, nous utilisons les instructions de prétraitement et la liaison des paramètres pour éviter l'épissage des chaînes SQL, empêchant ainsi efficacement l'injection SQL.