Start · Sprachen · PHP · Referenz · mysqli_escape_string

mysqli_escape_string

Funktion

Alias von <code>mysqli_real_escape_string()</code> — maskiert Sonderzeichen in einem String für die sichere Verwendung in SQL-Abfragen.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_escape_string(mysqli $mysql, string $string): string

Beschreibung

mysqli_escape_string() ist ein direkter Alias für mysqli_real_escape_string(). Die Funktion maskiert potenziell gefährliche Sonderzeichen in einem String, sodass dieser sicher in einen SQL-Befehl eingebettet werden kann. Dabei berücksichtigt sie den aktuellen Zeichensatz der übergebenen Datenbankverbindung.

Folgende Zeichen werden durch einen vorangestellten Backslash maskiert: \x00, \n, \r, \, ', " und \x1a. Das verhindert, dass ein Angreifer durch manipulierte Eingaben die SQL-Abfrage-Struktur verändert (SQL-Injection).

Da mysqli_escape_string() lediglich ein Alias ist, wird in der Praxis die Verwendung von mysqli_real_escape_string() empfohlen, um den Code eindeutig und selbstdokumentierend zu halten. Noch besser ist es, stattdessen Prepared Statements mit mysqli_prepare() bzw. PDO einzusetzen, da diese konzeptionell sicherer sind und SQL-Injection strukturell ausschließen.

Die Funktion steht im prozeduralen Stil zur Verfügung. Im objektorientierten Stil kann die Methode $mysqli->real_escape_string() verwendet werden.

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Eine aktive MySQLi-Datenbankverbindung, die zuvor mit mysqli_connect() oder new mysqli() erstellt wurde. Der Zeichensatz dieser Verbindung wird bei der Maskierung berücksichtigt.
$string Pflicht string Der zu maskierende String, beispielsweise ein Benutzereingabe-Wert, der in eine SQL-Abfrage eingebettet werden soll.

Rückgabewert

Typ
string
Beschreibung
Gibt den maskierten String zurück. Sonderzeichen werden dabei durch einen Backslash escapet, sodass der String sicher als Wert in einer SQL-Abfrage verwendet werden kann.

Beispiele

Einfaches Escapen einer Benutzereingabe

<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');

if (!$mysqli) {
    die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}

$benutzereingabe = "O'Reilly \"Hacker\" Wert";
$sicher = mysqli_escape_string($mysqli, $benutzereingabe);

echo $sicher;
// Ausgabe: O\'Reilly \"Hacker\" Wert

$sql = "SELECT * FROM benutzer WHERE name = '" . $sicher . "'";
echo $sql;

mysqli_close($mysqli);
O\'Reilly \"Hacker\" Wert SELECT * FROM benutzer WHERE name = 'O\'Reilly \"Hacker\" Wert'

Vergleich mit Prepared Statement (empfohlene Alternative)

<?php
// Unsicher / veraltet: mysqli_escape_string
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');
$name = mysqli_escape_string($mysqli, $_POST['name'] ?? '');
$sql = "SELECT * FROM benutzer WHERE name = '$name'";

// Empfohlen: Prepared Statement
$stmt = $mysqli->prepare('SELECT * FROM benutzer WHERE name = ?');
$stmt->bind_param('s', $_POST['name']);
$stmt->execute();
$ergebnis = $stmt->get_result();

while ($zeile = $ergebnis->fetch_assoc()) {
    echo htmlspecialchars($zeile['name']) . PHP_EOL;
}

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

// Wichtig · Fallstricke

Sicherheitshinweis: mysqli_escape_string() bietet keinen vollständigen Schutz gegen SQL-Injection, wenn der Zeichensatz der Verbindung nicht korrekt gesetzt ist. Es wird dringend empfohlen, den Zeichensatz explizit mit mysqli_set_charset() (z. B. auf utf8mb4) zu setzen, bevor diese Funktion aufgerufen wird. Andernfalls können Mehrbyte-Zeichensätze wie GBK für Bypass-Angriffe ausgenutzt werden.

Bevorzugte Alternative: Nutze wann immer möglich Prepared Statements mit mysqli_prepare() oder PDO. Diese schützen strukturell vor SQL-Injection und sind wartbarer als manuelles Escaping.

Da es sich um einen Alias handelt, kann die Funktion in zukünftigen PHP-Versionen als veraltet markiert oder entfernt werden. Verwende lieber direkt mysqli_real_escape_string() oder steige auf Prepared Statements um.