Skip to content


PHP mit unerwünschten Escape-Sequenzen

Momentan bin ich wieder ein wenig vertiefter im Umgang mit PHP und bin deshalb in den letzten Tagen auf folgendes Problem gestoßen. Bei der Übermittlung von Daten per GET- oder POST-Methode werden PHP-intern aufgrund von Sicherheitsrichtlinien, quotes, doublequotes und backslashes mit als Spezialzeichen behandelt. Das heißt, sie werden als Escape-Sequenzen angesehen. In meinem Fall werden HTML-Sources per POST an das Script übergeben. Dabei passiert es nun das Beispielsweise folgende Veränderung auftritt:

<a href=”link.html”>

wird zu

<a href=\”link.html\”>

Das heißt, der übergebene String lässt sich somit nicht mehr einfach als HTML konform ausgeben. Besonders deutlich wird es bei eingebettetem JavaScript:

var any_string = ‘foo\’bar’;

In diesem Fall wurde im JavaScript-code das Hochkomma mit dem Escapezeichen versehen, um es innerhalb des Strings zu erhalten. Wird dieser Teil nun an das PHP Script, wie oben erwähnt übermittelt, erhält man folgendes Konstrukt:

var any_string = \’foo\\\’bar\’;

Nun hatte ich also 2 Möglichkeiten: entweder mittels regulären Ausdrücken versuchen, die von PHP erstellten Escapesequenzen beseitigen oder mit einer normalen String-replace Methode, den Code korrekt umwandeln.

Bevor ich mich also daran machte, eine Konfrontation mit regular Expressions einzugehen, habe ich mich ein wenig auf php.net rumgestöbert. Es stand die Frage im Raum, welche Zeichen unterliegen der automatischen Prozeduren, sie zu Escape-sequenzen umzuwandeln. Dabei stieß ich auf die Funktion addslashes(string) mit folgender Erläuterung:

Gibt einen String (Zeichenkette) zurück, in dem bestimmten Zeichen ein Backslash “\” voran gestellt wurde. Diese Funktion ist z.B. für Datenbankabfragen wichtig. Die behandelten Zeichen sind das einfache und der doppelte Anführungszeichen ( und ), der Backslash selbst (\) sowie NUL (das Null-Byte).

Da es sich also offensichtlich nur um 3 Zeichen handelte, kam für mich der Kampf mit regulären Ausdrücken nicht mehr in Frage. Also konnte ich mittels str_replace folgende Sequenz erstellen:

$text = str_replace(‘\\\”, ‘%27′, $text);
$text = str_replace(‘\\\\’, ‘%5c’, $text);
$text = str_replace(‘\”‘, ‘%22′, $text);
$text = urldecode($text);

Nach Auffinden der Zeichen, lasse ich diese in HTML URL Verschlüsselungen umwandeln. Da ich nun keine Zeichen vorhanden habe, die mit den weiter folgenden Ersetzungen kollidieren könnten. Nachdem die 3 auftretenden Möglichkeiten ersetzt wurden, lass ich einfach den String wieder dekodieren und erhalte somit den Text in seiner schönen HTML konformen Form zurück.

Link: PHP: addslashes – Manual
Link: PHP: str_replace Manual
Link: HTML URL-encoding Reference

Posted in Programming, Webdesign.

Share it

5 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. schmidt says

    Aber warum benutzt du denn nicht das Gegenstück zu addslashesstripslashes.
    Das sollte doch das gewünschte Ergebnis liefern, ist schneller und einfacher.

  2. schmidt says

    BTW: deine Code-Umgebung macht nicht das, was ich erwartet habe. Ist es sehr aufwendig einen Preview-Knopf einzubauen?

  3. Pedda says

    wenn du stripslashes benutzt, geht alles solange gut, bis du zu meinem js beispiel kommst. in dem falle würde stripslashes auch das escapezeichen innerhalb des strings eliminieren, was allerdings nicht erwünscht ist, da dies ja ein gewolltes und mit absicht eingeführtes escape zeichen ist.

    die sache mit dem preview werd ich heut nachmittag mal angehen. sobald ich von arbeit zu hause bin.

  4. schmidt says

    Damit hätte ich nicht gerechnet. Schließlich heißt die Funktion doch nur stripslashes und nicht unescape oder so. Bist du sicher, dass stripslashes nicht genau das rückgängig macht, was vorher hinzugefügt wurde?

  5. tobitotz says

    u need to disable “magic_quotes_gpc ”
    it also will be obsolete in php 6

    best