Start · Sprachen · PHP · Referenz · mysql_escape_string

mysql_escape_string

Funktion

Maskiert Sonderzeichen in einem String für die sichere Verwendung in MySQL-Abfragen (veraltet, unsicher — stattdessen <code>mysqli_real_escape_string()</code> verwenden).

seit PHP 4.0.3 Kategorie: db

Signatur

mysql_escape_string(string $unescaped_string): string

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

Typ
string
Beschreibung
Gibt den maskierten String zurück, in dem alle sicherheitsrelevanten Sonderzeichen mit einem Backslash versehen wurden.

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;
O\'Reilly \"Test\" Wert SELECT * FROM buecher WHERE autor = 'O\'Reilly \"Test\" Wert'

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 mit PDO oder mysqli sind die einzig empfohlene Methode zur Verhinderung von SQL-Injection.

Bestehende Codebasen sollten dringend auf mysqli oder PDO migriert werden.