Benutzereingaben überprüfen
Konrad
- php
0 wahsaga0 Konrad
Hallo,
Es geht um Daten, die mittel Formular übergeben werde, zum einen durch
input Felder sowie durch textarea.
Diese Daten werden mittels strip_tags, html_entities sowie einem strg_replace("chr10 chr13", "<br />", $daten); "gesäubert".
Magic quotes ist on.
Trotzdem scheint es irgendwie möglich Steuerzeichen wie \n an diesem Skript vorbeizumogeln.
Dagegen kann ich leider im Moment nichts unternehmen, da mir nicht klar ist, wie man Steuerzeichen an diesen Befehlen vorbeibekommt.
Wenn mir da jemand auf dei Sprünge hlefen könnte, wäre das toll.
vielen Dank
Konrad
hi,
Diese Daten werden mittels strip_tags, html_entities sowie einem strg_replace("chr10 chr13", "<br />", $daten); "gesäubert".
Magic quotes ist on.
Trotzdem scheint es irgendwie möglich Steuerzeichen wie \n an diesem Skript vorbeizumogeln.Dagegen kann ich leider im Moment nichts unternehmen, da mir nicht klar ist, wie man Steuerzeichen an diesen Befehlen vorbeibekommt.
Mir ist nicht klar, wo du diese Steuerzeichen beseitigt haben willst - dass str_replace, auf "chr10 chr13" angewandt, nur den Text "chr10 chr13" ersetzen würde, sollte klar sein.
Eventuell meinst du den Aufruf der Funktion chr(), um die entsprechenden Zeichen zu erzeugen? Ja, dann ruf sie aber auch auf - und mach das außerhalb von Anführungszeichen, und lass das Leerzeichen zwischen den beiden Steuerzeichen weg.
Allerdings sollte dir auch klar sein, dass nicht jedes System die gleichen Zeilenumbrüche verwendet.
Wozu überhaupt ersetzen? Was passt dir an der Funktion nl2br() nicht, und wieso stört es dich, wenn neben dem HTML-Umbruch <br /> auch noch die originalen Steuerzeichen im Ergebnis enthalten sind?
gruß,
wahsaga
Hi,
endkrass, Du stellst ja mehr Fragen als ich ;-)
Mir ist nicht klar, wo du diese Steuerzeichen beseitigt haben willst - dass str_replace, auf "chr10 chr13" angewandt, nur den Text "chr10 chr13" ersetzen würde, sollte klar sein.
Ja, isses. Die funktion ist folgende:
$foo = chr(13);
$foo .= chr(10);
$_POST[$bla] = str_replace($foo, "<br />", $_POST[$bla]);
Eventuell meinst du den Aufruf der Funktion chr(), um die entsprechenden Zeichen zu erzeugen? Ja, dann ruf sie aber auch auf - und mach das außerhalb von Anführungszeichen, und lass das Leerzeichen zwischen den beiden Steuerzeichen weg.
Ja ist klar, ich habe das so aus dem Gedächtnis geschrieben.
Allerdings sollte dir auch klar sein, dass nicht jedes System die gleichen Zeilenumbrüche verwendet.
Ja, ist mir auch bewußt.
Wozu überhaupt ersetzen? Was passt dir an der Funktion nl2br() nicht, und wieso stört es dich, wenn neben dem HTML-Umbruch <br /> auch noch die originalen Steuerzeichen im Ergebnis enthalten sind?
Weil ich die Daten in einen Textfile schreiben will. Und zwar in eine Zeile pro Eingabe. Dann kann ich am einfachsten die Anzahl der Datensätze zählen, indem ich per file() den ganzen Schmus in ein Array schreibe un per count() die Anzahl bestimme. Da nerven dann aber jegliche Zeilenumbrüche, weil die dann den Count erhöhen.
Eigentlich ist das so auch gut am funktionieren. Irgendwie ist es aber gelungen einen Zeilenumbruch an dem ganzen Konstrukt vorbeizumogeln, das kann ich am flatfile erkennen. Mir ist bloß völlig unklar, WIE das vollbracht worden ist und ich kann es auch nicht reproduzieren. Also auch nicht verhindern.
Nein, eine Datenbank möchte ich nicht benutzen.
Meine Frage ist also ganz banal, wie kann man an:
$foo = chr(13)
$foo .= chr(10);
$_POST[$bla] = str_replace($foo, "<br />", $_POST[$bla]);
strip_tags();
html_entities();
ein Steuerzeichen (in dem Fall Zeilenumbruch) vorbeimogeln, indem man _was_? in ein Formularfeld schreibt. Wenn ich das wüsste, könnte ich dieses Zeichen auch einfach durch ein <brrrr/> ersetzen.
Und an nl2br() gefällt mir nicht, daß ich's nicht brauche. Wenn ich die Steuerzeichen entferne, kann ich sie auch gleich ersetzen, also muß ich nicht doppelmoppeln.
Außerdem macht sie je nach PHP Version mal <br> und mal <br/> und mal ruhig Brauner. Dann mach ich das lieber auf die Art und kenne das Ergebnis unabhängig von der PHP Version.
gruß
Konrad
Hi,
Meine Frage ist also ganz banal, wie kann man an:
$foo = chr(13)
$foo .= chr(10);
$_POST[$bla] = str_replace($foo, "<br />", $_POST[$bla]);
strip_tags();
html_entities();
ein Steuerzeichen (in dem Fall Zeilenumbruch) vorbeimogeln, indem man _was_? in ein Formularfeld schreibt.
strip_tags() und html_entities() haben damit ohnehin nichts zu tun.
Deine String-Ersetzung matched aber nur auf Windows-Umbrüche. Andere Betrienssysteme, andere Umbrüche - entweder nur LF oder nur CR.
freundliche Grüße
Ingo
Hi,
strip_tags() und html_entities() haben damit ohnehin nichts zu tun.
Direkt nicht, indirekt könnte man ja mit eingeschleustem Code eine Ausgabe im Skript veranlassen.
Deine String-Ersetzung matched aber nur auf Windows-Umbrüche. Andere Betrienssysteme, andere Umbrüche - entweder nur LF oder nur CR.
Verstehe nicht was das mit meinem Problem zu tun hat. Formulareingaben werden doch auf meinem Rechner verarbeitet. Der erzeugt nun diese Umbrüche, also kann ich sie doch auch so verarbeiten. (BTW wie wäre es auf einer Linuxkiste?)
Eigentlich will ich nur wissen: Kann man Steuerzeichen in so ein Skript infiltrieren, wenn die Eingabedaten mittels oben genannten Mechanismen entschärft werden?
[ ] Kann man nicht.
[ ] Kann man aber ich sag nicht wie, weil ich nicht will daß Du mein Formular aufmischst.
[ ] Kann man und ich sag Dir auch wie, weil ich nicht will dass man Dein Formular aufmischt:
_________________________________________________________________
_________________________________________________________________
{Raum für Eintragungen}
freundliche Grüße
auch so
Konrad
hi,
Deine String-Ersetzung matched aber nur auf Windows-Umbrüche. Andere Betrienssysteme, andere Umbrüche - entweder nur LF oder nur CR.
Verstehe nicht was das mit meinem Problem zu tun hat. Formulareingaben werden doch auf meinem Rechner verarbeitet.
Und wo kommen die Formularwerte _her_?
Der erzeugt nun diese Umbrüche
Warum sollte er?
Sie sind längst da.
gruß,
wahsaga
Hi,
Und wo kommen die Formularwerte _her_?
Warte, das heißt, wenn das Formular auf einem Mac ausgefüllt wird, kommen nicht \n\r bzw. LF CR am "Server" an sondern nur der MAC Zeilenumruch (nur \n oder?)
Daraus würde ich jetzt schließen ich müßte in etwa etwas benutzen wie:
$foo = chr(13);
$_POST[$bla] = str_replace($foo, "#", $_POST[$bla]);
$bar = chr(10);
$_POST[$bla] = str_replace($bar, "#", $_POST[$bla]);
$_POST[$bla] = str_replace("##", "<br />", $_POST[$bla]);
und damit würden dann Unix und Windows Umbrüche durch HTML Umbruch ersetzt. Meint Ihr das?
gruß Konrad
hi,
Warte, das heißt, wenn das Formular auf einem Mac ausgefüllt wird, kommen nicht \n\r bzw. LF CR am "Server" an sondern nur der MAC Zeilenumruch (nur \n oder?)
Den Zeilenumbruch erzeugt ein Browser, und der läuft unter irgendeinem OS, welches nicht gleich dem deines Servers sein muss.
Daraus würde ich jetzt schließen ich müßte in etwa etwas benutzen wie:
$foo = chr(13);
$_POST[$bla] = str_replace($foo, "#", $_POST[$bla]);
$bar = chr(10);
$_POST[$bla] = str_replace($bar, "#", $_POST[$bla]);
$_POST[$bla] = str_replace("##", "<br />", $_POST[$bla]);und damit würden dann Unix und Windows Umbrüche durch HTML Umbruch ersetzt. Meint Ihr das?
Wenn nur ein \r oder nur ein \n kommt, dann machst du daraus ein #, und versuchst anschließend ## zu ersetzen - wie viel wird da wohl gefunden ...?
Außerdem, was passiert wenn ## sich in der Benutzereingabe befand?
Eher empfehlenswert wäre eine Lösung, die mit beidem klarkommt.
$text = preg_replace('/\015\012|\015|\012/', '<br>', $text);
\012 und \015 sind die Oktalschreibweisen für hex. 0a 0d / dezimal 10 13 in regulären Ausdrücken, also die beiden gesuchten Steuerzeichen.
Und wenn diese in den Kombinationen \015\012 oder nur \015 oder nur \012 vorkommen, dann werden sie durch <br> ersetzt.
gruß,
wahsaga
Hi,
Den Zeilenumbruch erzeugt ein Browser, und der läuft unter irgendeinem OS, welches nicht gleich dem deines Servers sein muss.
Dann wird's klarer. Ich weiß jetzt selber nicht wieso, aber ich war der Ansicht, daß würde serverseitig bestimmt. Ähnlich wie die Struktur in HTML steht, die Formatierung aber im CSS. Gut, danke, wieder was gelernt.
Eher empfehlenswert wäre eine Lösung, die mit beidem klarkommt.
unbedingt! ;)
$text = preg_replace('/\015\012|\015|\012/', '<br>', $text);
\012 und \015 sind die Oktalschreibweisen für hex. 0a 0d / dezimal 10 13 in regulären Ausdrücken, also die beiden gesuchten Steuerzeichen.
Wenn man weiß wie's geht ist es ja echt einfach. Muß meine 2do-Liste um den Punkt regex erweitern!!
Danke Dir vielmals, Du hast mir sehr geholfen.
BTW: Deinen Blog finde ich echt interessant. Schade nur, dass so lange kein Eintrag gemacht wurde. Keine Themen? Deine bissiger Schreibstil ist echt amüsant.
gruß Konrad
Hi,
strip_tags() und html_entities() haben damit ohnehin nichts zu tun.
Direkt nicht, indirekt könnte man ja mit eingeschleustem Code eine Ausgabe im Skript veranlassen.
HTML-Tags tun serverseitigen Scripts überhaupt nicht "weh". Und Dir geht es ja auch gar nicht um Tags.
Deine String-Ersetzung matched aber nur auf Windows-Umbrüche. Andere Betrienssysteme, andere Umbrüche - entweder nur LF oder nur CR.
Verstehe nicht was das mit meinem Problem zu tun hat.
Schau Dir an, wonach Du in str_replace prüfst und dann versuche es zu verstehen.
freundliche Grüße
Ingo