Sitki: htmlentities() oder htmlspecialchars() ?

Hallo!

Ich würde gerne wissen wollen, in welchen Fällen die Funktion htmlentities() oder htmlspecialchars() einzusetzen ist. Und, ob eines der beiden Funktionen sicherer ist, als das eine.

Die Funktion htmlentities() unterstützt bsp. keine türk. Sonderzeichen, aber die Funktion htmlspecialchars() tut es. Kann hier problemlos die Funktion htmlspecialchars() eingesetzt werden?

  1. Moin!

    Ich würde gerne wissen wollen, in welchen Fällen die Funktion htmlentities() oder htmlspecialchars() einzusetzen ist. Und, ob eines der beiden Funktionen sicherer ist, als das eine.

    htmlspecialchars() ist immer dann angesagt, wenn das Encoding des Inputs auch dem Encoding des beabsichtigten Outputs entspricht.

    htmlentities() ist in den seltenen Fällen angesagt, in denen das Encoding des Inputs nicht dem Encoding des Outputs entspricht und der Output in irgendetwas ANDEREM als UTF-8 erfolgen soll. Das erfordert dann aber zwingend, dass erstens das Encoding des Inputs bekannt ist und zweitens der Funktion auch mitgeteilt wird. Resultat sind dann numerische Zeichenreferenzen für alle Zeichen, die nicht in Standard-ASCII dargestellt werden können.

    Unter dem Strich ist htmlspecialchars() also in 99,9% der Fälle die Funktion der Wahl.

    Die Funktion htmlentities() unterstützt bsp. keine türk. Sonderzeichen, aber die Funktion htmlspecialchars() tut es. Kann hier problemlos die Funktion htmlspecialchars() eingesetzt werden?

    Diese Aussage ist technisch nicht ganz korrekt. htmlspecialchars() kümmert sich ausschließlich um die Zeichen <, >, &, " und '. htmlentities() kümmert sich um weitaus mehr Zeichen, benötigt dazu aber die Angabe des Encodings. Da türkische Zeichen nicht im Default-Encoding ISO-8859-1 enthalten sind, werden diese logischerweise zerstört, da die identischen Bytewerte der türkischen Zeichen dort anderen Zeichen entsprechen und nach diesem abweichenden Schema in Entities gewandelt werden.

    In der Liste unterstützter Zeichensätze finden sich Varianten für westeuropäische Sprachen, kyrillische Schriften, Chinesisch und Japanisch, sowie UTF-8 für sämtliche Schriftzeichen der Welt.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo!

      Besten Dank für sehr nützlichen Informationen.

      Die Frage ist zwar indirekt beantwortet, würde jedoch nochmal konkret nachfragen, ob nun vom Sicherheitsaspekt die Funktion htmlspecialchars() oder htmlentities() besser gestellt ist?

      1. Moin!

        Die Frage ist zwar indirekt beantwortet, würde jedoch nochmal konkret nachfragen, ob nun vom Sicherheitsaspekt die Funktion htmlspecialchars() oder htmlentities() besser gestellt ist?

        Die Frage ist direkt beantwortet, finde ich.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
      2. echo $begrüßung;

        Die Frage ist zwar indirekt beantwortet, würde jedoch nochmal konkret nachfragen, ob nun vom Sicherheitsaspekt die Funktion htmlspecialchars() oder htmlentities() besser gestellt ist?

        Wenn du da nochmal nachfragst, ist dir sicherlich nicht klar, was konkret die Sicherheitesbeeinträchtigung im HTML-Kontext ist. HTML ist eines der Systeme, das Anweisungen und Nutzinhalte zusammen in ein Dokument bringt. Damit das eine vom anderen unterschieden werden kann, gibt es Regeln für die Syntax. HTML-Anweisungen werden in < und > notiert. Damit sind diese Zeichen nun für anzuzeigenden Text nicht mehr eindeutig verwendbar. Sie werden deshalb im Nutztext als Entity oder numerische Zeichenreferenz dargestellt. Wenn man sie nicht in dieser Form notiert und der Empfänger daraufhin eine Anweisung erkennt und umsetzt, die vom Autor der Seite so nicht gewünscht ist, ist das der Aspekt, der sicherheitstechnische Probleme verursachen kann.

        Die HTML-eigenen Zeichen sind die eine Sache. Dass man außerdem noch jedes beliebige andere Zeichen als numerische Zeichenreferenz und einige als Entity darstellen kann, hat keine Sicherheitsaspekte mehr sondern ist den Systemen geschuldet, die solche Zeichen nicht direkt verarbeiten können. Notwendig werden sie, wenn man eine Kodierung verwendet, die dieses Zeichen nicht enthält (z.B. € in ISO-8859-1). Kann man jedoch eine der Unicode-Kodierungen verwenden, besteht keine Notwendigkeit mehr, andere als die HTML-eigenen Zeichen indirekt zu notieren.

        echo "$verabschiedung $name";