Start · Sprachen · PHP · Referenz · mysql_real_escape_string

mysql_real_escape_string

Funktion

Maskiert Sonderzeichen in einem String für die sichere Verwendung in einer SQL-Anweisung über die veraltete <code>mysql_*</code>-Erweiterung.

seit PHP 4.3.0 Kategorie: db

Signatur

mysql_real_escape_string(string $unescaped_string, resource $link_identifier = null): string|false

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

Typ
string|false
Beschreibung
Gibt den maskierten String zurück. Im Fehlerfall (z. B. keine aktive Verbindung) wird false zurückgegeben.

Beispiele

Einfache Maskierung einer Benutzereingabe (PHP &lt; 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'
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.