Thomas Schmieder: HTML-Einbage über Textarea klammern

Guten Morgen,

ich habe immer noch ein Frage auf meinem großen Schreibtisch liegen, die ich bisher nicht zu stellen wagte. Aber eben strählt mich dieser Zettel an und meint, es wäre an der Zeit.

Szenario:
Onlineforum, Gästebuch oder ähnliches.
Eingabe der Seitendaten über Textareas.
Diverse HTML-Tags sind zugelassen. (welche da gefährlich werden könnten, ist mir auch noch nicht ganz klar)

Frage:
Was muss ich vor und nach der Anzeige des Textes (HTML-Code) aus der Textarea tun, damit die übrige Seite von diesem variablen Text nicht zerstört wird. Die Tags im Benutzrtext sollen ja nicht _angezeigt_ sondern _ausgeführt_ werden. Wenn jetzt z.B. ein <b> nicht wieder abgeschlossen wird, dann wäre evtl. der gesamte nachfolgende Text fett.

Wie kann ich möglichst intelligent (also ohne viel Gebastel) darauf reagieren? Was gibt CSS dafür her?

So, nun ist es raus. Lacht ruhig ein bisschen. Das ist morgens sehr gesund! Aber gebt mit bitte auch die Tipps rund um die Frage und auch auf die Eventualitäten, an die ich jetzt vielleicht noch gar nicht gedacht habe. Z.B., was ist mit <? bla bla delete all ?>...

Grüße aus http://www.bitworks.de

Tom

  1. Hi,

    normalerweise musst du die Ausgabe nur zwischen deine HTML-Tags setzen. Also so <b><u>Inhalt</u></b>
    Oder machst du es mit PHP???
    Ich frage, weil du ganz unten das blabla in PHP-Tags stehen hast.

    Einen schönen Tag
    Patrick

    Guten Morgen,

    ich habe immer noch ein Frage auf meinem großen Schreibtisch liegen, die ich bisher nicht zu stellen wagte. Aber eben strählt mich dieser Zettel an und meint, es wäre an der Zeit.

    Szenario:
    Onlineforum, Gästebuch oder ähnliches.
    Eingabe der Seitendaten über Textareas.
    Diverse HTML-Tags sind zugelassen. (welche da gefährlich werden könnten, ist mir auch noch nicht ganz klar)

    Frage:
    Was muss ich vor und nach der Anzeige des Textes (HTML-Code) aus der Textarea tun, damit die übrige Seite von diesem variablen Text nicht zerstört wird. Die Tags im Benutzrtext sollen ja nicht _angezeigt_ sondern _ausgeführt_ werden. Wenn jetzt z.B. ein <b> nicht wieder abgeschlossen wird, dann wäre evtl. der gesamte nachfolgende Text fett.

    Wie kann ich möglichst intelligent (also ohne viel Gebastel) darauf reagieren? Was gibt CSS dafür her?

    So, nun ist es raus. Lacht ruhig ein bisschen. Das ist morgens sehr gesund! Aber gebt mit bitte auch die Tipps rund um die Frage und auch auf die Eventualitäten, an die ich jetzt vielleicht noch gar nicht gedacht habe. Z.B., was ist mit <? bla bla delete all ?>...

    Grüße aus http://www.bitworks.de

    Tom

  2. Guten Morgen,

    Morgen

    Szenario:
    Onlineforum, Gästebuch oder ähnliches.
    Eingabe der Seitendaten über Textareas.
    Diverse HTML-Tags sind zugelassen. (welche da gefährlich werden könnten, ist mir auch noch nicht ganz klar)

    In jedem Fall über eine Positivliste, also alles ausschließen, was du nicht explizit erlaubst. Keine style-Attribute zulassen, sonst kann man ja fast alles machen (z.B. "display:hidden")

    Frage:
    Was muss ich vor und nach der Anzeige des Textes (HTML-Code) aus der Textarea tun, damit die übrige Seite von diesem variablen Text nicht zerstört wird. Die Tags im Benutzrtext sollen ja nicht _angezeigt_ sondern _ausgeführt_ werden. Wenn jetzt z.B. ein <b> nicht wieder abgeschlossen wird, dann wäre evtl. der gesamte nachfolgende Text fett.

    Nicht nur evtl. sondern ganz bestimmt. Du riskierst auf jeden Fall, daß deine Seiten nicht mehr valide sind. Mir fällt jetzt nur ein, daß du überprüfst, ob die Tags abgeschlossen sind. Du suchst also z.B. nach <b>, und wenn du kein </b> findest, dann setzt du es selbst ans ende. Mit PHP sollte soetwas machbar sein, ob es aber im Verhältnis zum nutzen steht, mußt du selbst entscheiden. "Leider" gibt es keinen Tag, der alle vorherigen Tags abschließt.

    Wie kann ich möglichst intelligent (also ohne viel Gebastel) darauf reagieren? Was gibt CSS dafür her?

    Z.B., was ist mit <? bla bla delete all ?>...

    Fals das PHP sein soll, den Befehl kenne ich nicht, aber PHP Tags mußt du natürlich (genauso wie ASP) außschließen, sonst haben die Leute ja zugriff auf dein Dateisystem, und dann wirds brenzlig.

    Ehrlich gesagt, würde ich es bleiben lassen. Die wenigsten Internetbesucher wissen mit Tags umzugehen, und für einen Gästebucheintrag sollten die verbreiteten Herforhebungen wie _diese_ eigentlich reichen. Oder du versuchst es nach dem Muster eines Online Editors, und bietest die Möglichkeit, nach dem Schreiben des textes mittels JavaScript einzelne Formatierungen vorzunehmen. Ich prophezeihe dir aber, daß du damit nicht glücklich werden wirst.

    cu

    Heizer

    1. Hallo neuer Tag, hallo Forum,

      Diverse HTML-Tags sind zugelassen. (welche da gefährlich werden könnten, ist mir auch noch nicht ganz klar)

      In jedem Fall über eine Positivliste, also alles ausschließen, was du nicht explizit erlaubst. Keine style-Attribute zulassen, sonst kann man ja fast alles machen (z.B. "display:hidden")

      soweit so gut. Ich werde bestimmt strip_tags($eingabe,$allowed_taglist); benutzen.
      PHP-Tags müssen abgefangen werden und Script-Tags (Java, JavaScript, ASP). Scheinbar ja auch CSS-Tags.

      Frage:
      Was muss ich vor und nach der Anzeige des Textes (HTML-Code) aus der Textarea tun, damit die übrige Seite von diesem variablen Text nicht zerstört wird. Die Tags im Benutzertext sollen ja nicht _angezeigt_ sondern _ausgeführt_ werden. Wenn jetzt z.B. ein <b> nicht wieder abgeschlossen wird, dann wäre evtl. der gesamte nachfolgende Text fett.

      Nicht nur evtl. sondern ganz bestimmt. Du riskierst auf jeden Fall, daß deine Seiten nicht mehr valide sind. Mir fällt jetzt nur ein, daß du überprüfst, ob die Tags abgeschlossen sind. Du suchst also z.B. nach <b>, und wenn du kein </b> findest, dann setzt du es selbst ans ende. Mit PHP sollte soetwas machbar sein, ob es aber im Verhältnis zum nutzen steht, mußt du selbst entscheiden. "Leider" gibt es keinen Tag, der alle vorherigen Tags abschließt.

      Ich dachte daran, dass es vielleicht sowas wie "<clear all> gibt und dass dann die Standard-CSS-Angaben für die Seite wieder gelten. Kann ich das nicht irgendwie mit <div class="normal"> oder so erreichen. Wenn ich nach der Anzeige des Inhaltes der Textarea so ein "Normal-CSS" benutze, müssten dadurch doch alle vorherigen Formatierungen wieder ausser Kraft gesetzt sein, oder?

      So ganz schwammig sehe ich da eine Lösung, aber sicher bin ich mir nicht. Drum frag ich Euch. Erstmal den Denkbereich erweitern. Jeder Gedanke hilft mir beim Sortieren.

      Grüße

      Tom

      1. Hallo neuer Tag, hallo Forum,

        Diverse HTML-Tags sind zugelassen. (welche da gefährlich werden könnten, ist mir auch noch nicht ganz klar)

        In jedem Fall über eine Positivliste, also alles ausschließen, was du nicht explizit erlaubst. Keine style-Attribute zulassen, sonst kann man ja fast alles machen (z.B. "display:hidden")

        soweit so gut. Ich werde bestimmt strip_tags($eingabe,$allowed_taglist); benutzen.

        Ich hatte da mal eine schöne Lösung für PHP in der Art (schreibe aus dem Gedächtnis:

        $text = str_replace("<b>","|b|",$text);
        $text = strip_tags($text);
        $text = html_entities($text);
        $text = str_replace("|b|","<b>",$text);

        Also zuerst alle erlaubten Tags in ein eigenes Format umwandeln (die pipe | eignet sich hier, weil es selten vorkommt und von html_entities nicht umgewandelt wird), alle verbleibenden Tags löschen, sonderzeichen ersetzen und die erlaubten Tags wieder zurückwandeln. Erschien mir ziemlich sicher. Mit einem Array voller erlaubter Tags und einer foreach-Schleife auch schön zu automatisieren.

        Ich dachte daran, dass es vielleicht sowas wie "<clear all> gibt und dass dann die Standard-CSS-Angaben für die Seite wieder gelten. Kann ich das nicht irgendwie mit <div class="normal"> oder so erreichen. Wenn ich nach der Anzeige des Inhaltes der Textarea so ein "Normal-CSS" benutze, müssten dadurch doch alle vorherigen Formatierungen wieder ausser Kraft gesetzt sein, oder?

        Vielleicht meinst du <br clear='all' />, das beendet aber nur ein vorhergehendes align. Das Problem ist, das <div class='normal'> CSS ist, <b> aber HTML.

        Oh, oder gibt es doch eine Lösung: wenn du das <b> in ein <span style="font-weight:bold"> umwandelst könnte das gehen. Hab das gerade nur mit Mozilla getestet, und da funktionierts:

        <div>
        <span style="font-weight:bold">Fett
        </div>
        <div style="font-weight:normal;">
        Nicht Fett
        </div>

        Hoffe, das hilft.

        Gruß

        Heizer