Karim: htmlentities

Wenn ich alle übergebenen Get und Post Variablen mit

htmlentities

durchlaufen lasse, bin ich dann (fast) auf der sicheren Seite. Oder muss ich noch weitere überprüfungen machen?

Karim

  1. Hallo,

    durchlaufen lasse, bin ich dann (fast) auf der sicheren Seite. Oder muss ich noch weitere überprüfungen machen?

    Was hast du denn vor? Bzw. zu welchem Zweck benutzt du htmlentities?

    Grüße

    1. Ich will nur verhindern, das SCHADcode auf meinen Server kommt und diesen einfach nicht zulassen.

      1. Hi,

        Ich will nur verhindern, das SCHADcode auf meinen Server kommt und diesen einfach nicht zulassen.

        "Schadcode" ist immer relativ zum Kontext zu sehen, in den die Usereingaben ausgegeben werden.
        htmlentities/htmlescape säubert die Usereingaben u.a. von HTML, so dass die meisten Cross-Site-Scripting-Attacken unmöglich werden. Die Usereingaben können aber auch z.B. SQL enthalten, welche deine Datenbank löschen oder verändern. Dann musst du z.B. mysql_real_escape (oder vergleichbare Funktionen, welche deine Datenbank/dessen Treiber) anbieten.

        Alles, was du darüber wissen willst und musst, steht im Artikel Kontextwechsel.

        Bis die Tage,
        Matti

        -- Webapplikationen in C++ entwickeln
        1. Ich verwandel nun alle POST Var mit

          foreach ( $_POST as $eingabe => $val )   { $_POST[$eingabe] = htmlentities ( $val );   }

          wäre es nicht sinnvoll, falls damit in der Datenbank gearbeitet wird es so zu machen

          foreach ( $_POST as $eingabe => $val )   { $_POST[$eingabe] = mysql_real_escape_string ((htmlentities ( $val ));   }
          1. Moin!

            Ich verwandel nun alle POST Var mit

            foreach ( $_POST as $eingabe => $val )   { $_POST[$eingabe] = htmlentities ( $val );   }

            wäre es nicht sinnvoll, falls damit in der Datenbank gearbeitet wird es so zu machen

            foreach ( $_POST as $eingabe => $val )   { $_POST[$eingabe] = mysql_real_escape_string ((htmlentities ( $val ));   }

            Du hast den Artikel nicht verstanden, oder?

            Kernaussage war dort: Kontextwechsel immer nur DORT behandeln, wo sie auftreten, niemals voreilig zu früh. Und genau das machst du hier.

            Es ist nicht sinnvoll, pauschal alle Werte in $_POST und $_GET irgendwie zu behandeln! Behandle sie dann, wenn du den Kontext wechselst. Wenn $_GET auf der HTML-Seite ausgegeben werden soll: htmlspecialchars(). Wenn $_GET in die Datenbank gehen soll: mysqli_real_escape_string(). Wenn das Datenbankergebnis wieder auf die Webseite soll: htmlspecialchars() auf das Ergebnis anwenden!

            Wenn du es nicht so machst, versaust du dir überall deine Daten und kannst mit ihnen nicht mehr vernünftig arbeiten.

             - Sven Rautenberg

            1. Ich versuche mal ein Beispiel zu machen:

              Die Daten kommen über ein Formular per POST (10 POST Felder), auf die Seite, also wandel ich alle Daten bevor ich sie weiterverarbeite mit:

              htmlspecialchars()

              um. Nach dem kein Fehler mehr vorliegt wandel ich diese dann per

              mysql_real_escape_string()

              und schreibe sie in die Datenbank! Wenn ich diese wieder auslese, dann wandel ich sie wieder per

              htmlspecialchars()

              zurück.

              1. Hi!

                Die Daten kommen über ein Formular per POST (10 POST Felder), auf die Seite, also wandel ich alle Daten bevor ich sie weiterverarbeite mit:
                htmlspecialchars()
                um.

                Falsch. Zur Weiterverarbeitung werden die Rohdaten benötigt. Siehe HTML in der Datenbank.

                Nach dem kein Fehler mehr vorliegt wandel ich diese dann per
                mysql_real_escape_string()
                und schreibe sie in die Datenbank!

                Im Falle MySQL richtig.

                Wenn ich diese wieder auslese, dann wandel ich sie wieder per
                htmlspecialchars()
                zurück.

                Nein, nicht beim Auslesen, egal woher, sondern erst beim Einfügen in den HTML-Kontext müssen sie HTML-gerecht behandelt werden. Wenn du sie anderswo einfügst, gelten die Regeln des anderen Kontextes.

                Lo!

                1. Ich glaub jetzt hab ichs verstanden.

                  Dafür klappt es jetzt nicht mehr.
                  Wenn ich folgenden Code habe

                  <form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES, 'iso-8859-15').'" method="post">

                  und den Satz

                  Ein 'Anführungszeichen' ist <b>fett</b>

                  übergebe, müsste laut Anleitung (http://php.net/manual/de/function.htmlentities.php)

                  Ein &#039;Anführungszeichen&#039; ist &lt;b&gt;fett&lt;/b&gt;

                  rauskommen.

                  Vieleicht kannst du mir da nochmal helfen?

                  1. Hi!

                    Wenn ich folgenden Code habe
                    <form action="'.htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES, 'iso-8859-15').'" method="post">
                    und den Satz
                    Ein 'Anführungszeichen' ist <b>fett</b>
                    übergebe, müsste laut Anleitung (http://php.net/manual/de/function.htmlentities.php)
                    Ein &#039;Anführungszeichen&#039; ist &lt;b&gt;fett&lt;/b&gt;
                    rauskommen.

                    Beides hat nicht viel miteinander zu tun. Das heißt, eigentlich müsste das so gehen, aber ein Satz hat als action-Attribut nichts verloren, da sollte eine URL stehen. Außerdem kann man statt $_SERVER['PHP_SELF'] auch einfach ein leeres action-Attribut notieren. Wie bei anderen relativen Angaben ergänzt der Browser das mit der URL des Dokuments, und somit kommt die derzeitige URL ohne Änderungen raus. Doch zurück zum Thema: Wo genau erwartest du, dass der Satz in die beschriebene Form gebracht wird?

                    Lo!