HTML-Code Filtern und bestimmte Tags erlauben

  • Hey Leute, :)


    Was ich versuche, klingt denkbar einfach, klappt aber noch nicht so 100%-ig.


    Ich gebe meinen Usern die Möglichkeit mittels eines editor einen Beschreibungstext zu verfassen. Dieser muss natürlich nach dem Absenden ncoh auf Böswilligkeiten überprüft werden :rolleyes::rolleyes:
    Dabei sind gewisse HTML-Tags erlaubt, und bestimmte nicht. Es darf zum Beispiel keine Bilder, andere Medien-Elemente geben, ebenso kein Javascript.
    Die Liste der erlaubten Tags ist überschaubar. Nun ist mir durchaus bewusst wie ich das grundsätzlich angehen würde, nämlich mittels

    PHP
    strip_tags()


    PHP.net Doku


    Damit fliegen zumindest erstmal sämtliche <script> Tags oder sowas raus, und stellen keine gefahr mehr dar. (oder?!) Alle erlaubten Tags, kann ich ja dort rausnehmen.


    Laut Doku dürfte auch PHP damit kein Thema mehr sein. (<?php bzw. <? soltle ja eig. mit entfernt werden)
    mein Problem ist eine der Warnungen aus der Doku.


    Zitat

    Warnung


    Diese Funktion modifiziert keine Attribute bei Tags, die via allowable_tags erlaubt wurden, dies betrifft auch style und onmouseover Attribute, die ein böswilliger User verwenden kann, um einen Text zu posten, der von anderen Usern gesehen werden soll.


    Damit wäre es nach meinem verständniss wiederrum möglich in z.B. onclick-Events Schadcode auszuführen.


    Nun endlich mal zu meinen konkreten Fragen:


    1. Hat jemand eine Idee wie ich sämtliche unerwünschten Attribute aus allen tags entferne??
    2. Reicht die Ausführung von "strip_tags" aus um den Code als "sicher" anzusehen, oder sollte man wietere validierungen vornehmen?


    Eine weitere Filterung ist jhalt schwierig, da ja die erlaubten Tags nicht verändert werden sollen (bis auf die Attribute)


    Hoffe es ist verständlich was mien Problem ist :thumbup::thumbup:


    MfG Kanu :D

  • Immer Filtern auf was Du erlauben möchtest, Nicht auf das, was Du nicht möchtest.
    Bsp:
    Angenommen es gibt momentan nur 2 tags: <script> und <b>
    Die beiden kennst Du und filterst auf das, was Du nicht erlauben möchtest: filter-><script> entfernen
    Alles ok, gewünschtes Ergebnis.


    Nach einem Jahr (Du hast schon lange nichts mehr an der Seite gemacht) gibt es einen neuen Tag: <böse>
    Und hier kommt das Problem: Du hast auf negatives gefiltert. Da war der <böse> tag aber nicht mit drin.
    Daher ist dieser tag jetzt aktiv/verfügbar.


    Wenn Du also auf positiv filterst und nur Dir bekannte "gute" tags erlaubst, dann kann kommen was will - alles was neu ist muss erst von Dir "eingebaut" werden.
    (Prinzip sollte man überall verwenden, wenn möglich)


    Zur Sache:
    Das einfachste wäre, Du erlaubst gar keine Ausführung von code.
    Das würdest Du mit htmlspecialchars() erreichen.
    Wie: gnadenlos JEDES einzelne Zeichen das irgendwo im Browser ausgegeben wird mit htmlspecialchars maskieren. Egal, ob es aus Deiner eigenen DB kommt, oder über POST.


    Wenn Du aber bestimmte tags erlauben möchtest, dann fällt mir auf Anhieb das Stichwort "Platzhalter" ein.
    Bsp:
    user input: "das ist mein <script>alert(1)</script> bold text"
    Diesen String speicherst Du einfach so wie er ist in der db.
    Aber beim Ausgeben suchst Du im String nach freigegebenen Tags:


    Zitat

    das ist mein <script>alert(1)</script> bold (<b >geht nicht)
    text. hier versuche ich den </body> zu beenden.


    (geht bestimmt noch bissl "schöner")
    Wie Du siehst wird zB ein Tag wie zB <tag parameter="abc"> wird also nie ausgeführt.
    Es läuft nur das, was laufen soll =)


    Macht 9.99€ :D


    edit:

    PHP
    // btw:
    $liste = array();
    foreach($erlaubt as $tag_paar){
        $liste[] = implode('', $tag_paar);
    }
    echo "<hr>erlaubte tags: " . htmlspecialchars(implode(', ', $liste));
    // out:  erlaubte tags: <b></b>, <i><i>, <br>
  • Erstmal DANKE :D


    Immer Filtern auf was Du erlauben möchtest, Nicht auf das, was Du nicht möchtest.


    Okay, das werd ich wohl jetzt auch nie wieder vergessen :thumbup:
    Ist eig. irgendwie sehr naheliegend, kam mir aber irgendwie nicht in den Kopf :D:D



    Zur Sache:
    Das einfachste wäre, Du erlaubst gar keine Ausführung von code.
    Das würdest Du mit htmlspecialchars() erreichen.
    Wie: gnadenlos JEDES einzelne Zeichen das irgendwo im Browser ausgegeben wird mit htmlspecialchars maskieren. Egal, ob es aus Deiner eigenen DB kommt, oder über POST.


    Bekannt, aber das steht leider nicht zur Wahl ^^



    Wenn Du aber bestimmte tags erlauben möchtest, dann fällt mir auf Anhieb das Stichwort "Platzhalter" ein.


    Wäre mir dieses Stichwort eingefallen wäre, hätte dir das vermutlich viel Zeit gespart :D:D


    Danke für das Code-Snippet ^^^^


    9,99€ 8|8| Billig ist anders :!::!::P:P


    Spaß :)


    Manchmal frage ich mich wofür zur Hölle ich Informatik studieren, wenn ich dort eig. nix lerne was mir im Produktiv-Einsatz hilft :rolleyes::rolleyes: (Theorie in allen ehren, aber ernsthaft...)


    Aber egal DAAANKEEE :D:D


    EDIT: PS: Verdammt waren das viele Smileys xD

  • Hehe, ja. Theorie is das eine, ...
    das is einer der Gründe, warum ich hier im Forum so "viel" lese/schreibe.
    Wenn man in Foren die Probleme anderer einfach mal zu Übungszwecken zu seinen eigenen macht, dann lernt man richtig viel.
    Auch wenn es nur Kleinigkeiten sind.
    =)

  • Hey nochmal ;)


    Da ich aber nun vor dem Problme stand, keine Attribute zulassen zu können. (Farben etc. müssen leider auch erlaubt sein...) Hab ich doch nochmal weiter gesucht, und bin auch eine Lösung gefunden, die ich ähnlich schon einmal gefunden hatte (sogar schonmal benutzt habe :rolleyes: ) Und die das Problem eig. sehr gut löst:


    Quelle: http://stackoverflow.com/quest…tributes-from-an-html-tag



    Auch hier wird alles maskiert bzw. entfernt, was nciiht auf das Muster meiner erlaubten tasg bzw. Attribute passt, so das auch das Problem neuer Tags keine Gefahr darstellen sollte.


    Ich werde es noch großzügig testen,aber denke so in der Art wird es meine Endlösung :)


    MfG Kanu


    PS: Ich weiß, auch diese Lösung arbeitet wieder mit strip_tags, aber ich bin in dem Fall einfach bereit der ufnktion zu vertruene, das sie wirklich alles maskiert, was kein allowable_tag ist...
    Mir ist zwar auch noch eine andere Lösung via "Platzhalter" eingefallen, aber diese wäre momentan etwas sehr oversized für mein Problem...

  • naja, strip_tags ist wie ein "Wilder", der über den Text rennt.

    Zitat


    Warnung
    Da strip_tags() HTML nicht wirklich validiert, kann es passieren, dass bei unvollständigen oder unkorrekten Tags mehr Text/Daten gelöscht werden als erwartet.
    Warnung
    Diese Funktion modifiziert keine Attribute bei Tags, die via allowable_tags erlaubt wurden, dies betrifft auch style und onmouseover Attribute, die ein böswilliger User verwenden kann, um einen Text zu posten, der von anderen Usern gesehen werden soll.


    Was mich sofort nerven würde ist, dass in meinem Text ein <---- o.ä. entfernt werden würde.
    Mehr noch - der Text dahinter wäre futsch.

  • Der Text den ich zu validieren suche, kommt aus dem Editor TinyMCE. Da kann ich ganz gut sichergehen, das gewisse Konstrukte nicht vorkommen...
    Aber ich teste auch gerade noche ine Lösung über Pattern mittels RegEx...
    Mal sehen ob das noch was wird...^^


    Und die böswilligen Attribute werden gefiltert ;)

  • Regex ... wir mögen uns gegenseitig nicht :D
    Hab Gestern oder Vorgestern erst versucht mit regex eine Zeichenkette auseinander zu nehmen.
    Hab dann aber festgestellt, dass es mit explode übersichtlicher und einfacher (für mich :D) wird.

  • Regex ... wir mögen uns gegenseitig nicht :D
    Hab Gestern oder Vorgestern erst versucht mit regex eine Zeichenkette auseinander zu nehmen.
    Hab dann aber festgestellt, dass es mit explode übersichtlicher und einfacher (für mich :D) wird.


    ^^ Habe ich mich auch lange schwer mit getan, aber irgendwann kam ich nicht mehr drum rum ^^ Wenn man dann irgendwelche eigenen URL mittels der htaccess machen will oder so, gibt es haklt nicht mehr immer fertige Codes...
    Und wenn man es einmal begriffen hat geht es eigentlich auch ;)


    Noch bin ich zu keiner gänzlich zufriedenstellenden Alternative gekommen, aber naja, wird schon noch :D

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!