Die Funktion stripslashes() entfernt Backslashes aus einer Zeichenkette. Aus \' wird ', aus \" wird " und aus \\ wird \. Die Funktion war früher vor allem im Zusammenspiel mit der PHP-Einstellung magic_quotes_gpc relevant, die seit PHP 5.4 entfernt wurde. Dieses Tutorial erklärt, wann stripslashes() heute noch gebraucht wird, welche Backslashes genau entfernt werden und wie man Legacy-Code sauber migriert.
Brauche ich stripslashes() noch?
In modernem PHP (ab Version 8.0) ist stripslashes() nur noch selten nötig. Die drei wichtigsten Szenarien:
Legacy-Code aus der magic_quotes-Ära: Wenn ein altes Projekt noch globale stripslashes()-Aufrufe auf $_GET, $_POST oder $_COOKIE enthält, müssen diese im Rahmen der Migration entfernt werden.
Daten aus externen Quellen: Manche APIs oder Datenbank-Exporte liefern Strings mit zusätzlichen Backslashes. In diesem Fall kann stripslashes() die Daten bereinigen.
Neuer Code: Hier braucht man stripslashes() fast nie. Stattdessen sollte man Prepared Statements für Datenbanken und korrekte Eingabeverarbeitung verwenden.
Syntax
Die Funktion erwartet einen String und gibt ihn ohne die Escape-Backslashes zurück.
stripslashes(string $string): string
Welche Backslashes werden entfernt?
stripslashes() entfernt jeden einzelnen Backslash, der vor einem anderen Zeichen steht. Das Verhalten lässt sich am besten anhand einer Übersicht verstehen:
<?php
/* Eingabe => Ausgabe */
echo stripslashes("O\'Reilly");
/* O'Reilly */
echo stripslashes('Pfad: C:\\Daten');
/* Pfad: C:\Daten */
echo stripslashes('Er sagte: \"Hallo\"');
/* Er sagte: "Hallo" */
echo stripslashes("Null-Byte: \0");
/* Null-Byte: (NUL-Zeichen) */
echo stripslashes("Zeile\nUmbruch");
/* ZeilenUmbruch (kein Zeilenumbruch!) */
?>
Der letzte Fall ist besonders wichtig: \n wird zu n, nicht zu einem Zeilenumbruch. stripslashes() kennt keine Escape-Sequenzen wie \n oder \t. Es entfernt einfach den Backslash und lässt das folgende Zeichen stehen.
Einfaches Beispiel
Im folgenden Beispiel wird ein String mit escaped Anführungszeichen bereinigt und mit echo ausgegeben.
<?php
$text = 'Er sagte: \"Das klappt.\"';
echo stripslashes($text);
/* Ausgabe: Er sagte: "Das klappt." */
?>
Der Backslash vor den Anführungszeichen wird entfernt, der Rest des Strings bleibt unverändert.
Hintergrund: magic_quotes_gpc
In älteren PHP-Versionen (vor 5.4) gab es die Einstellung magic_quotes_gpc. War sie aktiviert, fügte PHP automatisch Backslashes vor Anführungszeichen und Backslashes in $_GET, $_POST und $_COOKIE ein. Das sollte SQL-Injection verhindern, war aber fehleranfällig und sorgte für Verwirrung. stripslashes() wurde dann gebraucht, um diese automatisch hinzugefügten Backslashes wieder zu entfernen.
Seit PHP 5.4 existiert magic_quotes_gpc nicht mehr. In modernem PHP-Code ist stripslashes() daher nur noch in Ausnahmen nötig, etwa beim Import von Daten aus älteren Systemen oder beim Verarbeiten von Strings, die mit addslashes() erzeugt wurden.
Migration von magic_quotes-Code
Wer ein älteres Projekt auf PHP 8.x aktualisiert, findet häufig globale stripslashes()-Aufrufe im Code. Die folgende Checkliste hilft bei der Migration:
1. Suche nach get_magic_quotes_gpc() und entferne alle Aufrufe. Die Funktion existiert seit PHP 8.0 nicht mehr und wirft einen Fehler.
2. Finde globale stripslashes()-Aufrufe auf $_GET, $_POST und $_COOKIE und entferne sie. Diese waren nur wegen magic_quotes nötig.
3. Prüfe, ob addslashes() für SQL-Abfragen verwendet wird, und ersetze es durch Prepared Statements.
4. Teste die Anwendung gründlich, besonders Formulare und Datenbankzugriffe.
<?php
/* VORHER: magic_quotes-kompatibler Code */
if (get_magic_quotes_gpc()) {
$_POST = array_map('stripslashes', $_POST);
}
$name = addslashes($_POST['name']);
$sql = "INSERT INTO users (name) VALUES ('$name')";
/* NACHHER: Moderner Code mit PDO */
$stmt = $pdo->prepare(
'INSERT INTO users (name) VALUES (?)'
);
$stmt->execute([$_POST['name']]);
?>
Troubleshooting: Doppelt escaped Strings
Ein häufiges Problem bei Legacy-Code: Ein String kommt mit doppelten Backslashes an, zum Beispiel O\\'Reilly statt O\'Reilly. Das passiert, wenn magic_quotes aktiv war und der Code zusätzlich manuell addslashes() aufgerufen hat.
<?php
$kaputt = "O\\\\'Reilly";
/* Ein Aufruf reicht nicht */
echo stripslashes($kaputt);
/* Ergebnis: O\\'Reilly */
/* Zweiter Aufruf noetig */
echo stripslashes(stripslashes($kaputt));
/* Ergebnis: O'Reilly */
?>
Zur Diagnose hilft print_r() oder var_dump(), um die tatsächliche Anzahl der Backslashes im String sichtbar zu machen. Wenn ein String mehr Backslashes hat als erwartet, liegt es meistens an einer dieser Ursachen: doppeltes addslashes(), aktive magic_quotes in Kombination mit manuellem Escaping, oder eine Datenbank, die beim Lesen nochmals escaped.
stripslashes() auf Arrays anwenden
stripslashes() arbeitet nur mit Strings. Um ein mehrdimensionales Array zu verarbeiten, lässt sich eine rekursive Hilfsfunktion mit array_map schreiben.
<?php
function stripslashes_deep(mixed $value): mixed
{
if (is_array($value)) {
return array_map(
'stripslashes_deep',
$value
);
}
return is_string($value)
? stripslashes($value)
: $value;
}
$daten = [
'name' => "O\'Connor",
'stadt' => "M\\unchen",
'alter' => 30,
];
$bereinigt = stripslashes_deep($daten);
print_r($bereinigt);
/* Array (
[name] => O'Connor
[stadt] => M\unchen (ein Backslash)
[alter] => 30
) */
?>
Die Funktion prüft bei jedem Element, ob es ein Array oder ein String ist, und wendet stripslashes() nur auf Strings an. Zahlen und andere Typen bleiben unberührt.
str_replace() als gezieltere Alternative
Manchmal will man nur bestimmte Backslashes entfernen, zum Beispiel nur die vor Anführungszeichen, aber nicht die vor Backslashes. In diesem Fall ist str_replace() präziser als stripslashes().
<?php
$text = 'Er sagte \"Hallo\" und \\n';
/* stripslashes entfernt ALLE Backslashes */
echo stripslashes($text);
/* Er sagte "Hallo" und n */
/* str_replace: nur vor Anfuehrungszeichen */
echo str_replace('\"', '"', $text);
/* Er sagte "Hallo" und \n */
?>
stripslashes() ist ein Werkzeug mit breiter Wirkung. Wenn man gezielt einzelne Escape-Sequenzen entfernen will, ist str_replace() die bessere Wahl.
JSON-Kontext
Manchmal liefern schlecht implementierte APIs JSON-Strings mit zusätzlichen Backslashes vor den Anführungszeichen. In diesem Fall kann stripslashes() vor json_decode() helfen.
<?php
$kaputt = '{\"name\":\"Max\"}';
/* Ohne stripslashes: json_decode schlaegt fehl */
$daten = json_decode($kaputt, true);
/* null */
/* Mit stripslashes: funktioniert */
$daten = json_decode(stripslashes($kaputt), true);
/* ['name' => 'Max'] */
?>
Die bessere Lösung ist natürlich, die API zu reparieren, damit sie korrektes JSON liefert. stripslashes() ist hier nur ein Workaround.
Sicherheitshinweis: Kein Schutz vor SQL-Injection
stripslashes() ist keine Sicherheitsfunktion. Sie sollte niemals dazu verwendet werden, Daten für SQL-Abfragen vorzubereiten. Der einzig sichere Weg, um SQL-Injection zu verhindern, sind Prepared Statements mit Parameterbindung.
<?php
/* FALSCH: stripslashes schuetzt nicht */
$name = stripslashes($_POST['name']);
$sql = "SELECT * FROM users WHERE name='$name'";
/* RICHTIG: Prepared Statements verwenden */
$stmt = $pdo->prepare(
'SELECT * FROM users WHERE name = ?'
);
$stmt->execute([$_POST['name']]);
?>
Verwandte Funktion: addslashes()
stripslashes() ist das Gegenstück zu addslashes(). Während addslashes() Backslashes vor Anführungszeichen, Backslashes und NUL-Bytes einfügt, entfernt stripslashes() diese wieder.
<?php
$original = "O'Brien";
$escaped = addslashes($original);
$restored = stripslashes($escaped);
echo $escaped; // O\'Brien
echo $restored; // O'Brien
?>
Multibyte-Hinweis
stripslashes() ist nicht multibyte-sicher. Bei UTF-8-Strings mit Multibyte-Zeichen kann es in seltenen Fällen zu Problemen kommen, wenn ein Backslash-Byte (0x5C) zufällig Teil eines Multibyte-Zeichens ist. Bei Zeichensätzen wie GBK oder SJIS ist dieses Risiko höher als bei UTF-8.
Zusammenfassung
stripslashes() entfernt Escape-Backslashes aus Strings. Die Funktion stammt aus der Zeit von magic_quotes_gpc und wird in modernem PHP-Code selten benötigt. Für Datenbank-Sicherheit sind ausschließlich Prepared Statements zuständig. Für gezielte Ersetzungen ist str_replace() oft die bessere Wahl. Als Gegenstück zu addslashes() kann stripslashes() nützlich sein, wenn Daten aus Legacy-Systemen oder fehlerhaften APIs verarbeitet werden.