Markus: Gänsefüßchen in PHP

Ich will mit einer Textarea einen Wert übertragen, der sowohl reinen Text als auch auch html code enthalten kann. Jetzt hab ich aber das allseits bekannte Problem mit den Gänsefüßchen. Das reine ersetzen mit &qout reicht ja nicht, weil bei html-code Gänsefüchen stehen muss. Was kann ich machen??

Ach und der Befehl htmlspecialchars() funktioniert bei mir nicht. Erzeugt folgenden Fehlercode:
Warning: htmlspecialchars() expects parameter 2 to be long, string given in ... on line ...

  1. Hi Markus,

    Ich will mit einer Textarea einen Wert übertragen, der sowohl reinen Text als auch auch html code enthalten kann. Jetzt hab ich aber das allseits bekannte Problem mit den Gänsefüßchen. Das reine ersetzen mit &qout reicht ja nicht, weil bei html-code Gänsefüchen stehen muss. Was kann ich machen??

    Du lässt doch wohl hoffentlich nicht jeden HTML Code zu oder? Sondern du erlaubst nur einzelne HTML Tags, oder???

    Du müsstest da mal mit einem Regulären Ausdruck und preg_replace() oder so etwas rumprobieren.

    Ach und der Befehl htmlspecialchars() funktioniert bei mir nicht. Erzeugt folgenden Fehlercode:
    Warning: htmlspecialchars() expects parameter 2 to be long, string given in ... on line ...

    Dann hast du einen Fehler gemacht, lies noch mal im Manual nach: http://de2.php.net/manual/de/function.htmlspecialchars.php

    Vermutlich hast du irgendwie so etwas geschrieben:

    htmlspecialchars("Ein Text mit <html> ;-)", "ENT_COMPAT");

    Du müsstest jedoch schreiben:

    htmlspecialchars("Ein Text mit <html> ;-)", ENT_COMPAT);

    MfG, Dennis.

    --
    Mein SelfCode: ie:{ fl:{ br:^ va:) ls:< fo:) rl:( n4:& ss:) de:> js:( ch:{ sh:( mo:} zu:|
    Zufällige Hinweise:
    ------------------------
    Newbies aufgepasst: Auf viele Fragen findet man eine
    Antwort im Archiv, das man auch durchsuchen kann
    1. Hi Dennis,

      ich habe mir den Befehl htmlspecialchars() aus dem Beispiel von http://www.selfphp.info/funktionsreferenz/string_funktionen/htmlspecialchars.php kopiert. der sollte ja gehen ;)

      und zu meinem Problem:
      ich will jeden html tag erlauben!!!
      deswegen bräuchte ich die Hilfe. Wäre schön wenn jmd weiterhelfen könnte, denn ich trete z.Zt. auf der Stelle. Hab auch schon versucht bei google was zu finden :(

      1. Hello,

        ich habe mir den Befehl htmlspecialchars() aus dem Beispiel von http://www.selfphp.info/funktionsreferenz/string_funktionen/htmlspecialchars.php kopiert. der sollte ja gehen ;)

        Warum? Nur weil das Beispiel auf EINER Seite stand?
        Selbst im Manual zu PHP sind immer wieder Fehler oder "Unterlassungen" zu finden. Und das wird täglich von Hunderten Leuten benutzt, die durchaus schon PHP können und solche Fehler auch finden und Rückmeldung geben.

        und zu meinem Problem:
        ich will jeden html tag erlauben!!!

        Dann kann man Deine Seite mittels HTML, CSS und JavaScript gewaltig missbrauchen. Wenn Du dann auch noch irgendwo ein "offenes" Formmailer-Script ferumliegen hast, musst Du Dich nicht wundern, wenn es bals eine Menge SPAM mit Deiner IP (solltest Du eine feste haben) im Internet gibt.

        Daten sollten nach dem Empfang immer erst wieder rückkodiert werden in ein Raw-Format. Das ist eigentlich meistens noch der "normale" ASCII-Code. Hängt natürlich auch von Deiner persistenten Speicherung ab, also was Dein API, Dein OS/Filesystem und Deine Datenbank unterstützen. Das muss alles zusammen passen, damit keine Information verloren geht/hinzugemogelt wird (Konsistenz) und alle Codierungen reversibel bleiben.

        Die vom Browser übermittelten Daten werden von der Web-Schnittstelle (PHP-HTTP-API) teilwese automatisch dekodiert (urldecode() --> http://de3.php.net/manual/de/function.urldecode.php) oder mit Schutzmaskierungen belegt (magic_quotes_gpc --> http://de3.php.net/manual/de/ref.info.php#ini.magic-quotes-gpc.

        Wenn Du die Daten im Rohformat benötigst, um sie zu verarbeiten, musst Du die Magic-Quotes erst wieder entfernen, wenn sie gesetzt wurden. Das kann man in einer rekursiven Funktion eutomatisch machen und zwar mit dem jeweil benutzten kompletten Transfer-Array ($_GET, $_POST, $_COOKIE)

        #--------------------------------------------------------------------
        function strip($_data)              ## Datenarray übernehmen
        {
          if (!get_magic_quotes_gpc())      ## wenn keine magic-Quotes eingefügt
          {                                 ## wurden, wird das Array unverändert
            return $_data;                  ## zurückgegeben und die Funktion beendet
          }

        if (is_array($_data))             ## wenn der übergebene Wert ein Array ist
          {
            foreach($_data as $key => $val) ## wird die Funktion für jedes Element des
            {                               ## Arrays diskret aufgerufen
              $_data[$key] = strip($val);   ## und das umgewandelte Array zurückgegeben
            }
          }
          else                              ## sonst wird der Wert direkt umgewandelt
          {                                 ## und zurückgegeben
            $_data = stripslashes($data);
          }

        return $data;
        }
        #--------------------------------------------------------------------

        Aufruf erfolgt dann z.B. durch:

        $_POST = strip($_POST);             ## Danach sind die Maskierungen aus
                                            ## den $_POST-Elementen entfernt

        Nun musst Du aber selber besondere Voricht beim Umgang mit den Werten walten
        lassen. Du darfst sie nicht in den Execute-Focus des Parsers oder einer anderen
        aktiven Schnittstelle (Datenbank-API --> Query) legen, ohne sie vorher wieder
        genau untersucht oder entsprechend behandlet zu haben
        (z.B. mysql_[real_]escape_string() --> http://de3.php.net/manual/de/function.mysql-escape-string.php)

        Aus Erfahrung kann ich Dir raten, dass Du keinerlei html-Tags
          dazu gehören auch
          - <link rel...>
          - <meta ...>
          - <style ...>
          - <script ...>
        zulassen solltest, sondern besser für die paar erlaubten Operationen [bb]-Codes einführen solltest.

        Allerdings leben Foren- und Bord-Systeme davon, dass die Benutzer bedingt fremde Inhalte einbinden können, gegeseitig auf Beiträge mit aktiven Links verweisen können. Du solltest Dir also ein System überlegen, bei dem die Benutzer das können, Du als betreiber aber die volle Kontrolle über derartige Dinge behältst. Insbesondere, wenn auf externe Quellen verwiesen wird!

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hello,

          immer diesen kleinen Fehler...

          #--------------------------------------------------------------------
          function strip($_data)              ## Datenarray übernehmen
          {
            if (!get_magic_quotes_gpc())      ## wenn keine magic-Quotes eingefügt
            {                                 ## wurden, wird das Array unverändert
              return $_data;                  ## zurückgegeben und die Funktion beendet
            }

          if (is_array($_data))             ## wenn der übergebene Wert ein Array ist
            {
              foreach($_data as $key => $val) ## wird die Funktion für jedes Element des
              {                               ## Arrays diskret aufgerufen
                $_data[$key] = strip($val);   ## und das umgewandelte Array zurückgegeben
              }
            }
            else                              ## sonst wird der Wert direkt umgewandelt
            {                                 ## und zurückgegeben

          $_data = stripslashes($_data);

          }

          return $_data;

          }
          #--------------------------------------------------------------------

          Aber das hättest Du ja bestimmt gemerkt. Du benutzt ja bestimmt keinen fremden Code, ohne ihn vorher verstanden zu haben, oder? ;-))

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

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hello,

            immer diesen kleinen Fehler...

            #--------------------------------------------------------------------
            function strip($_data)              ## Datenarray übernehmen
            {
              if (!get_magic_quotes_gpc())      ## wenn keine magic-Quotes eingefügt
              {                                 ## wurden, wird das Array unverändert
                return $_data;                  ## zurückgegeben und die Funktion beendet
              }

            if (is_array($_data))             ## wenn der übergebene Wert ein Array ist
              {
                foreach($_data as $key => $val) ## wird die Funktion für jedes Element des
                {                               ## Arrays diskret aufgerufen
                  $_data[$key] = strip($val);   ## und das umgewandelte Array zurückgegeben
                }
              }
              else                              ## sonst wird der Wert direkt umgewandelt
              {                                 ## und zurückgegeben
                  $_data = stripslashes($_data);
              }

            return $_data;

            }
            #--------------------------------------------------------------------

            Aber das hättest Du ja bestimmt gemerkt. Du benutzt ja bestimmt keinen fremden Code, ohne ihn vorher verstanden zu haben, oder? ;-))

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

            Tom

            So vielen Dank, hätte es zwar nicht so kompliziert gebraucht, trotzdem super.

            Habe nur stripslashes() gesucht ;)

            1. Hello,

              So vielen Dank, hätte es zwar nicht so kompliziert gebraucht, trotzdem super.

              Habe nur stripslashes() gesucht ;)

              Klar, im ersten Anlauf.
              Aber stripslashes() solltest Du nur einsetzen, wenn wirklich welche hinzugefügt wurden vom System. Sonst hast Du evtl. nur noch Chaos übrig. Und Wenn nun ein Formular ein Array enthält (erzeugt), dann musst Du ja alle Skalare des Arrays behandeln. Das macht die Funktion alles automatisch. Also kann man sie in das Standard-Include all seiner Scripte aufnehmen und muss sich um nichts mehr kümmern, nur dran denken ;-))

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

              Tom

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