Sven: Textfeld "sicher" machen

Hallo ihr,

ich habe grade ein ziemlich umfangreiches Umfrage-Script fast fertiggestellt, eine kleine Sache bereit mir aber Schwierigkeiten:

An einigen Stellen befinden sich Textfelder (<textarea>). Ich würde den eingegebenen String gerne so korrigieren, dass auch Anführungszeichen, Hochkommata und ähnliches den Ablauf und die Ausgabe später nicht stören können.

Ich habe dazu versucht, mit stripslashes und str_replace zu arbeiten, habs aber nicht hinbekommen. Spätestens wenn man ein normales Anführungszeichen einfügt, fehlt jeglicher nachfolgender Text. Auch die Slashes bekomm ich nicht vollständig entfernt.

Kann mir da jemand weiterhelfen?

Grüße

  1. Hello,

    Ich habe dazu versucht, mit stripslashes und str_replace zu arbeiten, habs aber nicht hinbekommen. Spätestens wenn man ein normales Anführungszeichen einfügt, fehlt jeglicher nachfolgender Text. Auch die Slashes bekomm ich nicht vollständig entfernt.

    Mach Dir ein Daten-Zustands-Diagramm:

    Wann liegen die Daten in welcher Form vor, also wie sind sie codiert?
    In die Datenhaltung sollte immer das "normalisierte Format" geschrieben werden, also ein Zeichnsatz, der möglichst immer der Standardzeichensatz der Applikation ist.

    Das war früher z.B. mal ASCII.

    Wenn Nun also Daten aus dem Formular kommen, enthalten die alle Zeichencodes, die der User mittels seines Tastatur (oder Zischenablage, oder Menus, ...) dort hineinschreiben kann.

    Wenn PHP mit magic_quotes_gpc http://de3.php.net/manual/en/function.get-magic-quotes-gpc.php arbeitet, dann musst Du die Maskierungen (Backslashes) aus dem Paramterarray (GET, POST, COOKIE) rekursiv wieder entfernen. Danach stellst Du ein für die Schnittstelle der Datenhaltung passendes Übergabeformat her. Bei mySQL z.B. mit mysql_[real_]escape_string() http://de3.php.net/manual/en/function.mysql-escape-string.php, damit Du die Schnittstelle nicht aus versehen "umprogrammierst" (SQL-Injection).

    Die schnittstellentypischen Maskierungen werden NICHT mit in die Datenhaltung übernommen, sondern dienen nur der Unterdrückung der Steuerfunktion mancher Zeichen an der Schnittstelle.

    Wenn Du die Daten also dann später wieder holst, dann liegen sie im normalisierten Format vor. Bevor Du diese nun ausgibst, musst Du natürlich wieder überlegen, welche Maskeirungen die Ausgabeeinheit (Browser) benötigt. Wenn es ein HTML-Browser ist (es gibt ja schließlich auch andere --> Lotus), dann musst Du die Daten eben mit htmlentities() http://de3.php.net/manual/en/function.htmlentities.php oder einer ähnlichen Funktion behandeln. Für eine Textarea oder ein Input-Element reicht das. Bei Ausgabe im HTML-Fließtext musst Du noch in der geeigneten Reihenfolge die Newline-Sequenzen durch <br />-Tags ergänzen:

    $output = nl2br(htmlentities($raw_data));

    Und wenn Du diese Daten nun auch noch in einem Link übergeben willst, musst Du sie noch auf das für Links zulässige Format bringen --> http://de3.php.net/manual/en/function.urlencode.php.

    Wichtig ist für Dich nur, welches Format wann vorliegen muss, und ob eine Codierung (einfach) reversibel ist. Du solltest auch mal selber ein paar Versuche dazu machen. Es ist z.B. sinnlos, Daten zweimal zu "escapen", also erst addslashes() (ggf. automatisch) anzuwenden, und dann oben drauf noch mysql_escape_string(). Die doppelte Maskierung bringt dann nämlich enorme Probleme innerhalb von Datanbankabfragen. Vernünftige Filter werden dann nahezu unmöglich, wenn man sich nicht an ein einheitliches Speicherformat hält.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau