Signatur
Beschreibung
mysql_escape_string() maskiert Sonderzeichen in einem String, sodass dieser sicher in einer MySQL-SQL-Anweisung verwendet werden kann. Folgende Zeichen werden mit einem Backslash versehen: \x00, \n, \r, \, ', " und \x1a.
Wichtig: Diese Funktion berücksichtigt nicht den aktuellen Zeichensatz der Datenbankverbindung. Dadurch kann sie bei bestimmten Multibyte-Zeichensätzen (z. B. GBK) versagen und SQL-Injection ermöglichen. Für korrekte Maskierung sollte stattdessen mysql_real_escape_string() (ebenfalls veraltet) bzw. besser mysqli_real_escape_string() oder Prepared Statements verwendet werden.
Die gesamte mysql_*-Erweiterung wurde in PHP 5.5.0 als veraltet markiert und in PHP 7.0.0 vollständig entfernt. Neuer Code sollte ausschließlich mysqli oder PDO mit Prepared Statements einsetzen, da diese den sichersten Schutz vor SQL-Injection bieten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $unescaped_string Pflicht | string | Der zu maskierende String, der in eine MySQL-Abfrage eingefügt werden soll. |
Rückgabewert
Beispiele
Grundlegende Verwendung (historisch, nur zur Illustration)
<?php
// ACHTUNG: mysql_* ist seit PHP 7.0 nicht mehr verfügbar!
// Dieses Beispiel dient nur der historischen Dokumentation.
$benutzereingabe = "O'Reilly \"Test\" Wert";
$maskiert = mysql_escape_string($benutzereingabe);
echo $maskiert;
// Ausgabe: O\'Reilly \"Test\" Wert
$sql = "SELECT * FROM buecher WHERE autor = '" . $maskiert . "'";
echo $sql;
Moderne Alternative mit MySQLi und Prepared Statements
<?php
// EMPFOHLEN: Statt mysql_escape_string() Prepared Statements verwenden
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'datenbank');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$benutzereingabe = "O'Reilly \"Test\" Wert";
// Sichere Alternative 1: mysqli_real_escape_string
$maskiert = $mysqli->real_escape_string($benutzereingabe);
$sql = "SELECT * FROM buecher WHERE autor = '" . $maskiert . "'";
// Sichere Alternative 2 (BESTE Lösung): Prepared Statement
$stmt = $mysqli->prepare('SELECT * FROM buecher WHERE autor = ?');
$stmt->bind_param('s', $benutzereingabe);
$stmt->execute();
$ergebnis = $stmt->get_result();
while ($zeile = $ergebnis->fetch_assoc()) {
echo $zeile['titel'] . PHP_EOL;
}
$stmt->close();
$mysqli->close();
// Wichtig · Fallstricke
Sicherheitswarnung: mysql_escape_string() ist aus mehreren Gründen unsicher:
- Sie berücksichtigt nicht den aktuellen Verbindungszeichensatz, was bei Multibyte-Encodings wie GBK zu SQL-Injection führen kann.
- Die gesamte
mysql_*-Erweiterung ist seit PHP 5.5.0 als veraltet (deprecated) markiert und seit PHP 7.0.0 vollständig entfernt. Ein Aufruf unter PHP 7+ führt zu einem fatalen Fehler. - Selbst die Nachfolgefunktion
mysql_real_escape_string()ist nur ein Notbehelf — Prepared Statements mitPDOodermysqlisind die einzig empfohlene Methode zur Verhinderung von SQL-Injection.
Bestehende Codebasen sollten dringend auf mysqli oder PDO migriert werden.