Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

Backslashes vor Sonderzeichen entfernen

Sie befinden sich: Home > Php Tutorial > Backslashes vor...

Backslashes vor Sonderzeichen entfernen


Eintrag am:  27.12.2022
Hits / Besucher:  1185
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

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.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.