Formular: Richtig umgehen mit addslashes() und stripeslashes()
Christoph
- php
0 Matze0 Anschinsan0 Tom
1 dedlfix
Nabend :-)
Ich mache derzeit ein Kontaktformular, und das soll möglichst wasserdicht sein: Egal, was jemand dort einträgt, der Scriptablauf nicht beeinträchtigt sein.
Muss ich dazu den Formular-Inhalt dann einmal durch die Funktion stripeslashes() jagen, und vor der Ausgabe wieder addslashes() machen, oder wie macht man sowas typischer weise?
Grüße
Christoph
Hallo,
Ich mache derzeit ein Kontaktformular, und das soll möglichst wasserdicht sein: Egal, was jemand dort einträgt, der Scriptablauf nicht beeinträchtigt sein.
Muss ich dazu den Formular-Inhalt dann einmal durch die Funktion stripeslashes() jagen, und vor der Ausgabe wieder addslashes() machen, oder wie macht man sowas typischer weise?
denk doch nocheinmal darüber nach. Wozu sollte das gut sein?
Erst escapen, dann wieder rückgängig machen?
Wichtig ist bei Kontaktformularen, dass keine weiteren Header gesendet werden können, als die selbst festgelegten. Dazu dürfen keine Zeilenumbrüche in den Header geschleust werden.
Der Text im Mailbody sollte den Headern entsprechend kodiert werden.
Also z.B. mit htmlspecialchars() bei text/html.
Grüße, Matze
Wenn auf dem Server magicquotes = On eingestellt ist, brauchst du beides nicht. Das erfährst du mit phpinfo().
Überhaupt wäre ein Besuch gut auf:
http://de.php.net/manual/de/function.addslashes.php
Ich verwende bei meine Kontaktformularen noch striptags().
Wenn dein Script keine Datenbankanfrage startet bist du damit schon Mal gut dabei ...
Schönen Abend
Anschinsan
Hello,
Wenn auf dem Server magicquotes = On eingestellt ist, brauchst du beides nicht. Das erfährst du mit phpinfo().
Wenn auf dem Server magicquotes = On eingestellt ist, müssen die hinzugefügten Maskierungen (Backslashes) wieder entfernt werden, um die Rohdaten für die Weiterverarbeitung zu erhalten.
Bevor man damit etwas anstellt (SQL-Datenbnak, Mailheader, etc.) müssen sie entsprechend dem neuen Kontext _escaped_ werden bzw. auf unerlaubte Werte hin überprüft werden.
http://de.php.net/manual/de/function.addslashes.php
Ich verwende bei meine Kontaktformularen noch striptags().
Das ist auch nicht notwendig. Schließlich verliert man dadurch Informationen.
Bevor man die Daten im HTML-Kontext wieder ausgibt, muss man sie aber vorbereiten darauf.
Dafür gibt es
htmlspecialchars() http://de2.php.net/manual/en/function.htmlspecialchars.php
nl2br() http://de2.php.net/manual/en/function.nl2br.php
wordwrap() http://de2.php.net/manual/en/function.wordwrap.php
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom
echo $begrüßung;
Muss ich dazu den Formular-Inhalt dann einmal durch die Funktion stripeslashes() jagen, und vor der Ausgabe wieder addslashes() machen, oder wie macht man sowas typischer weise?
Das Feature Magic Quotes hatte den Zweck, Daten für SQL-Statements aufzubereiten. Doch es setzt zu einem falschen Zeitpunkt an. Es müssen nicht sämtliche Eingabedaten sondern die Daten, die in ein SQL-Statement wandern dem Datenbanksystem gemäß behandelt werden. Gibt man die Daten in einem HTML-Kontext aus, wie es bei einem Affenformular üblich ist, wenn Eingabefehler festgestellt wurden, sind die Slashes völlig fehl am Platz. Hier wäre htmlspecialchars() angebracht.
Empfehlenswert ist es, die Magic Quotes generell zu deaktivieren. Kann man die Konfiguration von PHP nicht ändern, oder ist es nicht voraussehbar, welche Konfiguration man antrifft, empfehle ich die Funktion aus Example#2 der eben verlinkten Seite einmalig am Scriptanfang einzubinden.
Wenn nun die Magic Quotes ausgeschaltet oder dessen Auswirkungen beseitigt wurden, kann und sollte man nun die Daten für eine bestimmte Ausgabe kontextspezifisch behandeln.
Die wichtigsten/häufigsten im Webumfeld sind:
Datenbanksystem: die für das System bereitgestellte Funktion (MySQL: mysql_real_escape_string(), Postgres: pg_escape_*(), PDO: ->quote(), usw.)
HTML: htmlspecialchars()
URL: je nach Position urlencode() oder rawurlencode()
Teilweise sind auch mehrere Kontexte zu beachten. Daten, die in eine URL eingebettet werden sollen, die in einem HTML-Kontext steht, sind zuerst URL-gerecht und anschließend HTML-gerecht zu behandeln.
echo "$verabschiedung $name";