André: htmlspecialchars

Hallo,

wenn ich diese Ausgabe im Browser aufrufe, wird mein HTML mit ausgegeben.

<?php echo htmlspecialchars($hinweis);?>

Dieses liegt am htmlspecialchars. Überalle lese ich, dass ich htmlspecialchars auf alle Fälle nutzten soll, aber in diesem Fall ist es nicht möglich oder kann ich dem htmlspecialchars eine Ausnahme hinzufügen?

In der Datenbank steht dieses:

<a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen.

  1. Tach!

    wenn ich diese Ausgabe im Browser aufrufe, wird mein HTML mit ausgegeben.

    <?php echo htmlspecialchars($hinweis);?>
    

    Dieses liegt am htmlspecialchars. Überalle lese ich, dass ich htmlspecialchars auf alle Fälle nutzten soll, aber in diesem Fall ist es nicht möglich oder kann ich dem htmlspecialchars eine Ausnahme hinzufügen?

    Du liest nicht genau genug oder es ist nicht genau genug beschrieben. Du musst das verwenden, wenn du Daten, die du zur Entwicklungszeit nicht kennst, in HTML einfügst. Die markierte Stelle ist wichtig. Wenn du HTML erstellst und dieses direkt ausgibst, dann ist das der Zeitpunkt. Erzeugst du das HTML früher, dann musst du es zu diesem "früher" erledigen.

    In der Datenbank steht dieses:

    <a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen.

    Warum auch immer HTML in der Datenbank steht ... in dem Fall ist der passende Zeitpunkt der, zu dem das HTML erstellt wird. Also bevor es in die Datenbank gelangt.

    Es gibt dabei aber ein Problem, wenn das HTML vom Anwender per Hand erstellt wird. Dann kann man nicht viel mehr machen, als an die Verantwortung des Anwenders zu appellieren, dass der alles korrekt eingibt.

    dedlfix.

    1. Hallo,

      Warum auch immer HTML in der Datenbank steht ... in dem Fall ist der passende Zeitpunkt der, zu dem das HTML erstellt wird. Also bevor es in die Datenbank gelangt.

      Daran kann ich leider nicht viel machen, dafür ist TinyMCE verantwortlich.

      Es gibt dabei aber ein Problem, wenn das HTML vom Anwender per Hand erstellt wird. Dann kann man nicht viel mehr machen, als an die Verantwortung des Anwenders zu appellieren, dass der alles korrekt eingibt.

      Ok, dann nehme ich das wieder raus und hoffe der User macht kein Misst. Ich kenn es z.B. von Joomla da kann man eine Whitelist anlegen, alle HTML Befehle z.B. <strong> werden zugelassen, der Rest wird nicht beachtet.

      1. Hallo André,

        Ok, dann nehme ich das wieder raus und hoffe der User macht kein Misst. Ich kenn es z.B. von Joomla da kann man eine Whitelist anlegen, alle HTML Befehle z.B. <strong> werden zugelassen, der Rest wird nicht beachtet.

        Schreibt denn ein Nutzer dieses <a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen. in die Datenbank?

        Bis demnächst
        Matthias

        --
        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
        1. Hallo Matthias,

          Schreibt denn ein Nutzer dieses <a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen. in die Datenbank?

          ja, da der Text bei jeder Anzeige sich ändern kann. Manche möchten ein Kontaktformular haben, die anderen möchten einen Mail Link haben.

          1. Hallo André,

            Schreibt denn ein Nutzer dieses <a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen. in die Datenbank?

            ja, da der Text bei jeder Anzeige sich ändern kann. Manche möchten ein Kontaktformular haben, die anderen möchten einen Mail Link haben.

            Ah, dann ist meine Antwort als falsch anzusehen.

            Bis demnächst
            Matthias

            --
            Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
  2. Hallo André,

    <?php echo htmlspecialchars($hinweis);?>
    

    Dieses liegt am htmlspecialchars. Überalle lese ich, dass ich htmlspecialchars auf alle Fälle nutzten soll, aber in diesem Fall ist es nicht möglich oder kann ich dem htmlspecialchars eine Ausnahme hinzufügen?

    In der Datenbank steht dieses:

    <a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen.

    Es ist zwar schlechte Praxis, HTML in eine Datenbank zu schreiben, aber ...

    In diesem Fall weißt du genau was drin steht, es sind also keine Nutzereingaben. Du kannst auf htmlspecialchars verzichten. Denn du möchtest ja gern das HTML als HTML ausgegeben haben und nicht als Text.

    Bis demnächst
    Matthias

    --
    Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
    1. Hallo

      In diesem Fall weißt du genau was drin steht, es sind also keine Nutzereingaben.

      Das weißt du woher [1]?

      Tschö, Auge

      --
      Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
      Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview

      1. Oder sollte ich mit Rumpelstilzchen darüber spekulieren, dass dir das der Deibel gesagt haben könnte? ;-) ↩︎

      1. Hallo Auge,

        In diesem Fall weißt du genau was drin steht, es sind also keine Nutzereingaben.

        Das weißt du woher?

        Gar nicht.

        Bis demnächst
        Matthias

        --
        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
  3. Hallo

    wenn ich diese Ausgabe im Browser aufrufe, wird mein HTML mit ausgegeben.

    Dieses liegt am htmlspecialchars. Überalle lese ich, dass ich htmlspecialchars auf alle Fälle nutzten soll, …

    Das ist, wenn das Ausgabeformat HTML sein soll, korrekt.

    … aber in diesem Fall ist es nicht möglich …

    Genauer gesagt, du hast es dir selbst unmöglich gemacht, wie unten zu sehen ist.

    … oder kann ich dem htmlspecialchars eine Ausnahme hinzufügen?

    Nein. Die Funktion htmlspecialchars nimmt keine Ausnahmen entgegen.

    In der Datenbank steht dieses:

    <a href="kontakt.html">E-Mail schreiben.</a> Wir werden Ihnen gern weiterhelfen.

    Womit wir bei der Ursache wären. Dass in den Rohdaten HTML-Elemente sind, ist der Grund, warum sie maskiert werden. Würden deine Rohdaten den Link z.B. als BB- oder Markdown-Code (oder andere Arten, die nicht HTML sind) enthalten, könnten diese nach der Behandlung mit htmlspecialchars in HTML umgewandelt werden. Hier stellt sich die Frage, warum die Rohdaten HTML-Elemente enthalten und wie groß der (einmalige?) Aufwand ist, diese daraus zu entfernen.

    Tschö, Auge

    --
    Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
    Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
    1. Hallo André, Hallo Auge,

      wenn es sich nur um Links handelt, könntest du diese (nachdem du htmlspecialchars drüber gejagt hast), per RegEx suchen und durch „echte“ Links ersetzen.

      Gruß
      Julius

      1. Hallo

        wenn es sich nur um Links handelt, könntest du diese (nachdem du htmlspecialchars drüber gejagt hast), per RegEx suchen und durch „echte“ Links ersetzen.

        Das ist zwar von hinten durch die Brust in's Auge und eigentlich will man das nicht haben, aber ja, gehen tut's.

        Aber weil du das Tag „sicherheit“ hinzugefügt hast, sei explizit gesagt, dass dann alle Links (wenn es denn nur solche sind, die nachbehandelt werden) demaskiert werden. An der Stelle sollte man sich schon sehr sicher sein, dass keine schädlichen Links eingegeben wurden.

        Tschö, Auge

        --
        Wir hören immer wieder, dass Regierungscomputer gehackt wurden. Ich denke, man sollte die Sicherheit seiner Daten nicht Regierungen anvertrauen.
        Jan Koum, Mitgründer von WhatsApp, im Heise.de-Interview
        1. Hallo Auge,

          Aber weil du das Tag „sicherheit“ hinzugefügt hast, sei explizit gesagt, dass dann alle Links (wenn es denn nur solche sind, die nachbehandelt werden) demaskiert werden. An der Stelle sollte man sich schon sehr sicher sein, dass keine schädlichen Links eingegeben wurden.

          Das dürfte aber immer noch sicherer sein, als dem Nutzer zu erlauben, alles Mögliche an HTML, CSS und Javascript einzutragen, oder?

          Gibt es eigentlich zu überprüfen, ob ein Link schädlich sein könnte? Dieser Kurzlinkservice meint das zumindest erkennen zu können – steckt da ein Abgleich mit einer Liste mit Malware ausliefernden Seiten dahinter oder wie könnte sowas realisiert worden sein?

          Gruß
          Julius

          1. Tach!

            Aber weil du das Tag „sicherheit“ hinzugefügt hast, sei explizit gesagt, dass dann alle Links (wenn es denn nur solche sind, die nachbehandelt werden) demaskiert werden. An der Stelle sollte man sich schon sehr sicher sein, dass keine schädlichen Links eingegeben wurden.

            Das dürfte aber immer noch sicherer sein, als dem Nutzer zu erlauben, alles Mögliche an HTML, CSS und Javascript einzutragen, oder?

            Es kommt darauf an, was das Ziel ist. Will man ein CMS erstellen, sollte man davon ausgehen können, dass nur administrativ berechtigte Nutzer Texte erstellen können. Dann kann man die ganze Sache etwas gelassener angehen. Man möchte in aller Regel sogar dem Anwender die Freiheit geben, sich beliebig zu entfalten. Erstellt man hingegen etwas, das unbekannte Nutzer befüllen sollen, dann kann man nicht vorsichtig genug sein.

            dedlfix.

            1. Hallo,

              Es kommt darauf an, was das Ziel ist. Will man ein CMS erstellen, sollte man davon ausgehen können, dass nur administrativ berechtigte Nutzer Texte erstellen können. Dann kann man die ganze Sache etwas gelassener angehen. Man möchte in aller Regel sogar dem Anwender die Freiheit geben, sich beliebig zu entfalten. Erstellt man hingegen etwas, das unbekannte Nutzer befüllen sollen, dann kann man nicht vorsichtig genug sein.

              wie machen die großen CMS System wie z.B. Joomla oder Wordpress dieses? Verzichten die komplett auf htmlspecialchars? In den zwei genannten System habe ich eigentlich alle Freiheiten solange ich den eingebauten Editor nutzte. Wenn ich mir den Quelltext anschauen, habe ich oftmals Inline-CSS.

              1. Tach,

                Es kommt darauf an, was das Ziel ist. Will man ein CMS erstellen, sollte man davon ausgehen können, dass nur administrativ berechtigte Nutzer Texte erstellen können. Dann kann man die ganze Sache etwas gelassener angehen. Man möchte in aller Regel sogar dem Anwender die Freiheit geben, sich beliebig zu entfalten. Erstellt man hingegen etwas, das unbekannte Nutzer befüllen sollen, dann kann man nicht vorsichtig genug sein.

                wie machen die großen CMS System wie z.B. Joomla oder Wordpress dieses? Verzichten die komplett auf htmlspecialchars? In den zwei genannten System habe ich eigentlich alle Freiheiten solange ich den eingebauten Editor nutzte. Wenn ich mir den Quelltext anschauen, habe ich oftmals Inline-CSS.

                ich könnte jetzt nochmal die Antwort kopieren, die du bereits zitierst hast. In diesen CMS ist es je nach Konfiguration vorgesehen, dass du HTML notieren kannst; welche User das dann wo und wie können, ist Entscheidung des zugehörigen Admins.

                mfg
                Woodfighter

      2. Hallo Julius,

        wenn es sich nur um Links handelt, könntest du diese (nachdem du htmlspecialchars drüber gejagt hast), per RegEx suchen und durch „echte“ Links ersetzen.

        Es sollte einfach kein HTML in der Datenbank stehen. Ich weiß zwar nicht, wie die Anforderungen sind, aber ich würde in der Konfiguration Felder für Link zum Kontaktformular, Linkziel, Linktext und zusätzlicher Text vorsehen.

        Bis demnächst
        Matthias

        --
        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)