Onkel Schnitzel: HTML-Zeichen umwandeln

Hi,

ich schicke Daten aus einem Formular per POST in eine Verabeitungsdatei. Dort steht unter anderem dies:

$artikel = htmlspecialchars($_POST['eintragl']);

Die Variable $eintrag schreibe ich dann später in meine Datenbank. Ich dachte eigentlich, daß man mit 'htmlspecialchars' HTML-Tags umwandeln kann, um sich vor Hackerangriffen zu schützen. Doch wenn ich im Formular z.B. '<p>' eingebe, wird mein Eintrag mit einem Absatz dargestellt. Das soll doch eigentlich nicht passieren- ist ja eine riesengroße Sicherheitslücke. Was muß ich tun, um meine Datenbank zu schützen?

Grüße,
Onkel Schnitzel

  1. Hallo Onkel,

    Du suchst AFAIK nach der Funktion htmlentities().

    Bis dann!

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Du suchst AFAIK nach der Funktion htmlentities().

      Moment, eigentlich sollte es auch mit htmlspecialchars klappen.
      Der Fehler scheint aber nicht in dem Codestück zu liegen das du uns gegeben hast, wäre also schön wenn du noch etwas Code zur Verfügung hättest. ;-)

      Bis dann!

      Marc Reichelt || http://www.marcreichelt.de/

      --
      Linux is like a wigwam - no windows, no gates and an Apache inside!
      Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
      http://emmanuel.dammerer.at/selfcode.html
      1. wäre also schön wenn du noch etwas Code zur Verfügung hättest. ;-)

        Najut ;-) Also das ist das Formularfeld:

        <textarea name="artikel" id="artikel" rows="15" cols="55"></textarea>

        Dies wird in die Verabreitungsdatei übertragen, dort u.a. "gesäubert" und anschließend an die Sendedatei weiterverschickt

        $artikel = htmlspecialchars($_POST['artikel']);

        echo "<input type="hidden" name="artikel" value="$artikel" />\n";

        In der Sendedatei werden die Daten in die Datenbank geschrieben:

        VALUE '".$_POST['artikel']."')";

        Ausgelesen wird das Ganze ganz normal:

        ....while($auslesen = mysql_fetch_assoc($anfrage));

        ....echo $auslesen['artikel'];

        1. Hallo

          Dies wird in die Verabreitungsdatei übertragen, dort u.a. "gesäubert" und anschließend an die Sendedatei weiterverschickt

          $artikel = htmlspecialchars($_POST['artikel']);

          echo "<input type="hidden" name="artikel" value="$artikel" />\n";

          Hast du mal in den Quelltext der Seite geschaut, ob im Hiddenfeld der gewünschte Inhalt drin steht?

          Tschö, Auge

          --
          Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
          (Victor Hugo)
          Veranstaltungsdatenbank Vdb 0.1
          1. Hast du mal in den Quelltext der Seite geschaut, ob im Hiddenfeld der gewünschte Inhalt drin steht?

            Naja, auch da ist der Fehler wohl schon. Meine Eingabe im Formular ist z.B.: "Hallo, <p>TEST"   Im Quelltext steht genau das <p>-Tag mit drin.  Und bei der Ausgabe steht halt:

            "Hallo,

            TEST"

        2. hi,

          Dies wird in die Verabreitungsdatei übertragen, dort u.a. "gesäubert" und anschließend an die Sendedatei weiterverschickt

          $artikel = htmlspecialchars($_POST['artikel']);

          echo "<input type="hidden" name="artikel" value="$artikel" />\n";

          hier stehen jetzt also beispielsweise " (muss ja auch) und auch < und > kodiert im _quelltext_ - &quot;, &lt; und &gt;

          wenn du statt dem hidden mal ein text-feld genommen hättest, wäre dir aber aufgefallen, dass das natürlich wieder als ", < und > _angezeigt_ wird.

          und genau so _überträgt_ der browser die daten beim absenden dieses formulars natürlich auch wieder - ", < und >

          In der Sendedatei werden die Daten in die Datenbank geschrieben:

          VALUE '".$_POST['artikel']."')";

          da ", < und > übertragen wurden - _unkodiert_ - musst du hier natürlich noch mal erneut kodieren, wenn du &quot;, &lt; und &gt; in der DB stehen haben willst.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. da ", < und > übertragen wurden - _unkodiert_ - musst du hier natürlich noch mal erneut kodieren, wenn du &quot;, &lt; und &gt; in der DB stehen haben willst.

            Hat geklappt. Danke :-)

            Ist meine Datenbank damit jetzt eigentlich sicher, zumindest was diese Cross-Side-Scripting betrifft? Oder sind noch mehr Vorkehrungen zu treffen?

            Gruß,
            Onkel Schnitzel

            1. hi,

              Ist meine Datenbank damit jetzt eigentlich sicher, zumindest was diese Cross-Side-Scripting betrifft? Oder sind noch mehr Vorkehrungen zu treffen?

              vor allem müssen natürlich deine einfügungen selbst abgesichert werden, bevor sie an die DB übergeben werden.

              mysql_real_escape_string() wurde dir IIRC heute schon genannt.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
            2. Hallo Onkel,

              Hat geklappt. Danke :-)

              Ist meine Datenbank damit jetzt eigentlich sicher, zumindest was diese Cross-Side-Scripting betrifft? Oder sind noch mehr Vorkehrungen zu treffen?

              So lange du den String nicht maskierst, bevor du ihn in die Datenbank einträgst, kann zumindest jeder in deiner Datenbank Daten verändern.
              Und das wäre glaube ich nicht so toll... ;-)

              Bis dann!

              Marc Reichelt || http://www.marcreichelt.de/

              --
              Linux is like a wigwam - no windows, no gates and an Apache inside!
              Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
              http://emmanuel.dammerer.at/selfcode.html
              1. So lange du den String nicht maskierst, bevor du ihn in die Datenbank einträgst, kann zumindest jeder in deiner Datenbank Daten verändern.

                Ich dachte eigentlich, genau das verhindere ich mit meinem 'htmlspecialchars'. Naja, jedenfalls komme ich mit diesem 'mysql_real_escape_string' überhaupt nicht klar. Wo ist denn der Unterschied zu meinem Befehl? Kann/muß ich beide kombinieren? Bei mir passiert beim Einsatz von mysql_real.... nämlich überhaupt nichts. So wird z.B. ein <p>-Eintrag wieder als HTML-Befehl interpretiert. Bin total verwirrt :-((

                1. Ich dachte eigentlich, genau das verhindere ich mit meinem 'htmlspecialchars'. Naja, jedenfalls komme ich mit diesem 'mysql_real_escape_string' überhaupt nicht klar. Wo ist denn der Unterschied zu meinem Befehl? Kann/muß ich beide kombinieren?

                  Also, ich habs hinbekommen :-) Man muß wohl unterscheiden zwischen den Anweisungen, die die Darstellung im Browser betreffen und denen die die Datenbank direkt betreffem.

                  Ich hoffe bloß, daß mein

                  '".mysql_real_escape_string($_POST['artikel'])."', auch wirklich das macht, was es soll. Kann man das irgendwie überprüfen? So ganz trau ich dem Frieden noch nicht :-)

                  1. echo $begrueszung;

                    Man muß wohl unterscheiden zwischen den Anweisungen, die die Darstellung im Browser betreffen und denen die die Datenbank direkt betreffem.

                    Ja, genau so ist es am besten. Und allgemein gesagt gilt: Eingaben bei der Eingabe demaskieren, intern mit Rohdaten arbeiten, zur jeweiligen Ausgabe hin entsprechend maskieren.

                    Ich hoffe bloß, daß mein

                    '".mysql_real_escape_string($_POST['artikel'])."', auch wirklich das macht, was es soll. Kann man das irgendwie überprüfen? So ganz trau ich dem Frieden noch nicht :-)

                    Natürlich, lass dir den SQL-Befehl doch ganz einfach mal anzeigen. Vergiss dabei aber nicht die Ausgabe zum HTML hin zu maskieren, oder schau dir das Original in der Quelltext-Ansicht an.

                    echo "$verabschiedung $name";