Signatur
Beschreibung
mysql_real_escape_string() maskiert in einem gegebenen String alle Zeichen, die in SQL-Anweisungen eine Sonderbedeutung haben könnten, z. B. einfache Anführungszeichen ('), doppelte Anführungszeichen ("), Backslashes (\), NULL-Bytes sowie Zeilenumbrüche. Die Maskierung erfolgt entsprechend dem Zeichensatz der aktuellen Datenbankverbindung, sodass Mehrbyte-Angriffsvektoren ebenfalls abgewehrt werden.
Die Funktion schützt vor SQL-Injection-Angriffen, sofern der zurückgegebene String korrekt in ein SQL-Statement eingebettet wird – typischerweise in einfache Anführungszeichen. Sie ist das ältere Äquivalent zu mysqli_real_escape_string() aus der mysqli-Erweiterung.
Achtung: 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 vorbereiteten Anweisungen (Prepared Statements) verwenden, da diese eine strukturell sichere Alternative bieten und keine manuelle Maskierung erfordern.
Ein häufiger Fallstrick: Wird mysql_real_escape_string() ohne eine aktive Datenbankverbindung aufgerufen, versucht PHP, eine Verbindung über mysql_connect() herzustellen. Schlägt dies fehl, gibt die Funktion false zurück und erzeugt einen Fehler.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $unescaped_string Pflicht | string | Der zu maskierende String, z. B. ein Benutzereingabe-Wert, der in eine SQL-Anweisung eingebettet werden soll. | |
| $link_identifier | resource | null | Die MySQL-Verbindungsressource, die durch mysql_connect() zurückgegeben wurde. Wird kein Wert übergeben, wird die zuletzt geöffnete Verbindung verwendet. Der Zeichensatz dieser Verbindung bestimmt die Maskierungslogik. |
Rückgabewert
false zurückgegeben.Beispiele
Einfache Maskierung einer Benutzereingabe (PHP < 7.0)
<?php
// Verbindung herstellen
$link = mysql_connect('localhost', 'db_user', 'db_pass');
mysql_select_db('meine_datenbank', $link);
// Unsichere Benutzereingabe
$benutzername = "O'Reilly";
$passwort = 'geheim\'123';
// Maskierung vor dem Einbetten in den SQL-String
$safe_benutzername = mysql_real_escape_string($benutzername, $link);
$safe_passwort = mysql_real_escape_string($passwort, $link);
$sql = "SELECT * FROM benutzer
WHERE name = '$safe_benutzername'
AND passwort = '$safe_passwort'";
$result = mysql_query($sql, $link);
echo $sql;
// SELECT * FROM benutzer WHERE name = 'O\'Reilly' AND passwort = 'geheim\'123'
Moderne Alternative mit PDO Prepared Statements (empfohlen)
<?php
// Empfohlene Alternative ab PHP 5.1+ / für alle aktuellen PHP-Versionen
$pdo = new PDO('mysql:host=localhost;dbname=meine_datenbank;charset=utf8mb4', 'db_user', 'db_pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$benutzername = "O'Reilly";
$passwort = 'geheim\'123';
// Prepared Statement – keine manuelle Maskierung notwendig
$stmt = $pdo->prepare('SELECT * FROM benutzer WHERE name = :name AND passwort = :passwort');
$stmt->execute([
':name' => $benutzername,
':passwort' => $passwort,
]);
$zeilen = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump(count($zeilen));
// Wichtig · Fallstricke
Sicherheitswarnung: mysql_real_escape_string() ist kein Allheilmittel gegen SQL-Injection. Die Funktion schützt nur dann zuverlässig, wenn der maskierte String in einfache oder doppelte Anführungszeichen eingeschlossen wird. Wird er ohne Anführungszeichen eingebettet (z. B. bei numerischen Werten direkt im SQL), bietet die Funktion keinen Schutz.
Deprecation / Entfernung: Die mysql_*-Erweiterung ist seit PHP 5.5.0 offiziell veraltet (deprecated) und seit PHP 7.0.0 vollständig entfernt. Code, der diese Funktion verwendet, ist auf PHP 7+ nicht mehr lauffähig. Migriere zu mysqli_real_escape_string() oder – besser – zu PDO mit Prepared Statements.
Zeichensatz-Fallstrick: Der Zeichensatz der Verbindung muss korrekt gesetzt sein (z. B. via mysql_set_charset()), bevor mysql_real_escape_string() aufgerufen wird. Andernfalls kann es bei Mehrbyte-Zeichensätzen wie GBK zu Maskierungsfehlern kommen, die SQL-Injection ermöglichen.