Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie MySQLI :: get_charset, um den Zeichensatz zu überprüfen, um die SQL -Injektion zu verhindern

Verwenden Sie MySQLI :: get_charset, um den Zeichensatz zu überprüfen, um die SQL -Injektion zu verhindern

M66 2025-05-25

In der Webentwicklung von PHP ist die SQL -Injektion eine häufige und gefährliche Sicherheitsbedrohung. Um die SQL -Injektion effektiv zu verhindern, verwenden Sie zusätzlich zur Verwendung vorbereiteter Anweisungen, der Parameterbindung und anderer Methoden, dass der von der Datenbankverbindung verwendete Zeichensatz auch eine wichtige Verbindung ist. Dieser Artikel konzentriert sich auf die Verwendung der MySQLI :: Get_Charset -Funktion und ihre Rolle bei der Verhinderung der SQL -Injektion.

Was ist MySQLI :: get_charset ?

Mysqli :: get_charset ist eine Methode, die von der PHP MySQLI -Erweiterung bereitgestellt wird, um die Zeichensatzinformationen der aktuellen Datenbankverbindung zu erhalten. Es gibt ein Objekt zurück, das Zeichensatzeigenschaften enthält, wie z. B. Zeichensatzname, Codierung usw.

Zeichensätze spielen eine wichtige Rolle in der Datenbanksicherheit, da ein Angreifer, wenn die Zeichensätze nicht ordnungsgemäß eingestellt sind, Codierungsunterschiede verwenden kann, um die Eingabevalidierung zu umgehen oder spezielle Injektionsnutzlasten zu konstruieren.

Zum Beispiel verwendet MySQL standardmäßig die Latin1 -Codierung. Wenn der Client UTF8 -Daten einreicht, der Server jedoch Latin1 verwendet, können unerwartete Zeichen auftreten, was zu einer SQL -Injektion führt.

Wie überprüft der Zeichen mit MySQLI :: get_charset ?

Schauen wir uns zuerst ein grundlegendes Beispiel an:

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

// Überprüfen Sie, ob die Verbindung erfolgreich ist
if ($mysqli->connect_errno) {
    die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}

// Holen Sie sich Charakter -Set -Informationen
$charsetInfo = $mysqli->get_charset();

echo "Der Zeichensatz, der von der aktuellen Verbindung verwendet wird: " . $charsetInfo->charset;
?>

Dieses Skript gibt den Zeichensatz der aktuellen Datenbankverbindung aus, z. B. UTF8MB4 . Es ist eine gute Angewohnheit, UTF8MB4 anstelle von UTF8 zu verwenden, da UTF8 tatsächlich eine Drei-Byte-Kodierung in MySQL ist und nicht alle Unicode-Zeichen unterstützt, während UTF8MB4 die vollständige Vier-Byte-UTF-8-Codierung ist.

Warum sind Charaktersätze wichtig, um die SQL -Injektion zu verhindern?

Charaktersätze beeinflussen, wie der Server die vom Client gesendeten Daten versteht und verarbeitet. Wenn die Datenbankverbindung Latin1 verwendet, die Eingabedaten jedoch Multibyte -Zeichen enthalten, können einige Byte -Sequenzen als SQL -Kontrollzeichen (z. B. Einzelzitate, Semikolons) missverstanden werden, was zu einer SQL -Injektion führt.

Durch die Verwendung von GET_CHARSET im Programm, um zu überprüfen, ob die Verbindung ein sicherer Zeichensatz ist ( UTF8MB4 wird empfohlen), kann das Risiko von Angriffen, die durch Codierungsfehlanpassung verursacht werden, erheblich reduziert werden.

Praktischer Kampf: Wie kann man Get_Charset und Sicherheitsschutz in Kombination verwenden?

Der folgende Code zeigt ein vollständiges Szenario:

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

// Überprüfen Sie die Verbindung
if ($mysqli->connect_errno) {
    die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}

// Überprüfen Sie den Zeichensatz
$charsetInfo = $mysqli->get_charset();
if ($charsetInfo->charset !== 'utf8mb4') {
    // Gezwungen zu utf8mb4
    if (!$mysqli->set_charset("utf8mb4")) {
        die("Zeichensatz kann nicht festgelegt werden: " . $mysqli->error);
    }
    echo "Der Charakter -Set wurde auf aktualisiert utf8mb4\n";
} else {
    echo "Der aktuelle Zeichensatz ist utf8mb4\n";
}

// Verhindern Sie die Injektion unter Verwendung von Vorverarbeitungsanweisungen
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ?");
if (!$stmt) {
    die("Die Vorverarbeitung schlug fehl: " . $mysqli->error);
}

// Simulieren Sie den von der Benutzereingabe erhaltenen Wert
$userInput = $_GET['email'] ?? '';

// Parameter binden und ausführen
$stmt->bind_param("s", $userInput);
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    echo "Benutzername: " . htmlspecialchars($row['username']) . "\n";
}

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

In diesem Beispiel verwenden wir nicht nur Get_Charset , um den Zeichensatz zu überprüfen, sondern auch set_charset , um sicherzustellen, dass die Verbindung sicher ist. Als nächstes verwenden wir Vorverarbeitungsanweisungen und Parameterbindung, um SQL -Zeichenfolgen zu vermeiden, wodurch die SQL -Injektion effektiv verhindert wird.