PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Backslashes in Strings


helgi
25.04.2003, 02:45:46
Gegeben sei ein Formular mit einem Textfeld, in das ein Benutzer beliebigen Text eintragen kann. Wenn magic_quotes_gpc=on ist, werden Sonderzeichen wie z.B. das Hochkomma oder der Backslash kommentiert (escaped) an PHP übergeben. Ich verstehe allerdings nicht, warum doppelte Backslashes unter PHP nur als ein Slash interpretiert werden. Beispiel:
<?php
$var1="\'";
$var2="\\";
?>
Das Ergebnis von strlen($var1) ist 2, während das Ergebnis von strlen($var2) 1 ist.
stripslashes() sollte normalerweise EINEN Kommentar (Escape) wieder entfernen, bei zwei Backslashes bleibt aber keiner übrig. Die Eingabe 'c:meinedatei.txt' im Formular wird als 'c:meinedatei.txt' an PHP übergeben und nach stripslash zu 'c:meinedatei.txt'.

c4
25.04.2003, 07:45:48
Hinweis vorweg: Aus Verzweiflung wurden / statt dargestellt. Im Beispielskript wurde natürlich mit getestet.

<?php
// 1
$foo="/";
echo strlen($foo)."<br>"; // --> 2

// 2
$foo='/'';
echo strlen($foo)."<br>"; // --> 1

// 3
$foo="//";
echo strlen($foo)."<br>"; // --> 1

// 4
$foo='//';
echo strlen($foo)."<br>"; // --> 1

// 5
$foo="c:programmeapacheinapache.exe";
// 5a
echo $foo."<br>"; // --> c:programmeapacheinapache.exe
// 5b
echo stripslashes($foo)."<br>"; // --> c:programmeapachebinapache.exe
?>

- 1
Das ' muss nicht maskiert werden, da es in einer Zeichenkette mit " als Begenzung genutzt wird

- 2
Hier muss es maskiert werden, da es sonst Probleme mit den ' als Begrenzungen geben würde

- 3
Wenn man einen Backslash darstellen will, muss dieser maskiert werden - so geschehen

- 4
...die Begrenzung der Zeichenkette interessiert da nich

- 5a
Da keines der Zeichen hinter den ein Escape-Zeichen ist, werden sie alle dargestellt
- 5b
stripslashes() entfernt einfach alle - egal ob sie zur Maskierung nötig waren oder nicht

Würde der Pfad z.B. C:programmenewssystembin lauten, dann würde das n bei newssystem als Zeilenumbruch erkannt werden und auch entsprechend gehandhabt werden. Da muss man dann addslashes() anwenden, damit die auch wirklich angezeigt werden und nicht auf die Idee kommen Escape-Zeichen zu verarbeiten.


Alle Klarheiten beseitigt?

helgi
25.04.2003, 11:02:57
Das habe ich verstanden, dafür schon 'mal vielen Dank (Wenngleich der Code, so wie er oben steht, nicht funktionieren kann. In Beispiel 1 fehlt hinterm Backslash das Hochkomma).
Es hilft mir aber in meinem Problem nicht richtig weiter: In einem Formular soll der Benutzer in einem Textfeld beliebigen Text eingeben dürfen. Sämtliche Tags aus der Eingabe sollen mit strip_tags() entfernt werden. Außerdem soll die Eingabe mit stripslashes() für eine Ausgabe vorbereitet werden. Leider kann das Skript nicht erkennen, wann der Benutzer als TEXT z.B. eine Datei wie c:programmeapachebinapache.exe beschreiben möchte.

<?php
$result=isset($_REQUEST["text"])?strip_tags($_REQUEST["text"]):"";
//$result kann jetzt in eine Datenbank geschrieben werden
$output=stripslashes($result);
//$output kann jetzt ausgegeben werden
?>
<form action="<?php echo $PHP_SELF;?>" method="post">
<input type="text" name="text">
</form>

Ist mein Problem verstanden worden? Wieso geht das eigentlich hier im Forum?

helgi
25.04.2003, 11:09:17
Nachtrag:
Original geschrieben von _c_4_
stripslashes() entfernt einfach alle - egal ob sie zur Maskierung nötig waren oder nicht

Das ist so nicht richtig. Doppelte Backslashes sollen zu einem Backslash umgesetzt werden:http://www.php.net/manual/de/function.stripslashes.php

helgi
26.04.2003, 00:44:09
Bin jetzt selbst auf die Lösung gekommen:

<?php
$db_entry=isset($_REQUEST["text"])?strip_tags($_REQUEST["text"]):"";
//$db_entry kann jetzt in eine Datenbank geschrieben werden
$text=stripslashes(htmlspecialchars($db_entry,ENT_QUOTES));
//$text kann jetzt ausgegeben werden
?>
<form action="<?php echo $PHP_SELF;?>" method="post">
<input type="text" name="text">
</form>