Portal > Foren > PHP > PHP-Programmierung > HTML-Input optimal filtern
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 15.10.2007, 23:57 Nach oben    #1
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.208
Standard HTML-Input optimal filtern

Mir geht es um folgendes, für ein Kommetarfeld will ich der Einfachheit halber html erlauben aber mit recht begrenzten Mitteln (nur gewisse Tags und nur gewisse attribute für die tags erlaubt) und suche daher nach einer fertigen Lösung mit der man sowas recht einfach erledigen kann, sprich eine einfache config (z.b. in form eines arrays mit den erlaubten tags + dazugehörigen attributen) und einfaches anwenden:

PHP-Code:
$filter = new HtmlInputFilter();
$output $filter->setConfig(array('a'=>array('href','title'),'strong','em', ..... )
           ->
setData($postcommentdata)
           ->
filter()
           ->
getFilteredData(); 
bzw. halt auch ohne diese Verkettung, ich denke es ist klar was gemeint ist.

Vom Grundgedanken her erstmal nicht kompliziert sowas eventuell mit Regex zu erledigen, aber weitere Probleme tauchen auf: invalides html (vergessen elemente zu schließen oder ähnliches) desweiteren soll es auch nicht möglich sein in irgendeiner form JavaScript / CSS einzubauen, sei es über a href, a onclick oder über sonst irgendwelche möglichen Bugs.

Bis jetzt gefunden habe ich htmlpurifier, aber noch nicht getestet (was ich dann mal tun werde). Mit ca 700kb Code (160 Dateien) nur für die library erschlägt mich das ganze grad erstmal Wenn ich die Konfigurationsmöglichkeiten überfliege: http://htmlpurifier.org/live/configdoc/plain.html bekomme ich das Gefühl, das Teil ist so ne art eierlegende Wollmilchsau für das was ich suche


Würde mich freuen falls jemand ein paar Erfahrungen beisteuern kann oder andere Alternativen kennt.
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.10.2007, 09:22 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Also die Plauderecke ist ja definitiv mal das falsche Forum. Da es sich offenbar um eine PHP-spezifische Frage handelt, verschiebe ich den Thread auch mal in diesen Bereich.

*verschoben*
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2007, 21:04 Nach oben    #3
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 690
Standard

Hmm... Für das, was du da vor hast scheint mir die Klasse etwas "oversized" zu sein!? Das muss doch auch einfacher und vorallem kürzer gehen!?

Was spricht denn gegen einen eigenen Filter mittels RegEx? Bei a-Tags kannst du ja durch Verbieten von onClick schon JavaScript in der Hinsicht ausschalten. Bzw. all on*irgendwas*-Attribute garnicht erst erlauben, was denke ich Sinn macht!?

Das größere Problem wird aber wohl tatsächlich sein, auf korrektes HTML zu achten... Hmm...
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.10.2007, 21:12 Nach oben    #4
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.208
Standard

Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
Hmm... Für das, was du da vor hast scheint mir die Klasse etwas "oversized" zu sein!? Das muss doch auch einfacher und vorallem kürzer gehen!?

Was spricht denn gegen einen eigenen Filter mittels RegEx? Bei a-Tags kannst du ja durch Verbieten von onClick schon JavaScript in der Hinsicht ausschalten. Bzw. all on*irgendwas*-Attribute garnicht erst erlauben, was denke ich Sinn macht!?

Das größere Problem wird aber wohl tatsächlich sein, auf korrektes HTML zu achten... Hmm...
naja ich habe wenn ich das selbst schreibe bedenken
1) an alles zu denken
2) eventuelle Sicherheitslücken oder so zu vergessen
3) Aufwand

Gerade mit regex tue ich mich dann bei sowas schwer, alle möglichen Fälle, die Reihenfolge in denen es stehen darf ...... zu erfassen.

Ich bin bis jetzt wegen Uni und ein paar andern Dingen aber auch noch nicht weiter mit der Klasse zum testen gekommen, aber ich werde das hoffentlich am Wochenende nachholen können.

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.10.2007, 08:03 Nach oben    #5
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 690
Standard

OK, du hast Angst was zu vergessen, aber ich frage dich was besser ist: a) Es selber vergessen oder b) Sich blind darauf verlassen, dass der Andere an alles gedacht hat...

Was die RegEx angeht, so würde ich erstmal die einzelnen Elemente auslesen lassen und prüfen, sowie durchnummerieren:

Code:
<div>
<div>Dies ist <b>Box 2</b> in <b>Box 1</b></div>
<div>Dies ist <b>Box 3</b> in <b>Box 1</b></div>
</div>
Würde dann zu:

Code:
<div:1>
<div:2>Dies ist <b:1>Box 2</b:1> in <b:1>Box 1</b:1></div:2>
<div:2>Dies ist <b:1>Box 3</b:1> in <b:1>Box 1</b:1></div:2>
</div:1>
Auf diese Weise findest du bei verschachtelten Elementen immer das passende Gegenstück mittels eines RegEx und dem dazugehörigen Modifier "U", damit er auch wirklich nur den dazugehörigen Close-Tag nimmt. Warum sind jetzt aber mehrere Tags mit der gleichen Zahl definiert? Kann ich dir sagen: Ich habe diese Methode bei meinen BB-Codes angewendet und in einem Array das Element als Key mit einem Count als Wert gepflegt. Kam ein weiteres Element hinzu, wirde es inkrementiert (bevor der Wert eingefügt wurde!), wurde eins geschlossen, dann wurde entsprechend dekrementiert (nachdem der Wert eingefügt wurde!). Ist man bei 0 angekommen, wurde der Wert bei 0 belassen, denn dann wurden mehr Tags geschlossen, als vorher geöffnet wurden. Diese können dann später aussortiert werden.

Wenn du nun am Ende noch schaust, welcher Wert größer ist als 0, dann weißt du auch schon, dass bei diesem Tag zu wenige Close-Tags gesetzt wurden.

Wenn du nun auch noch etwas mehr Aufwand betreibst, speicherst du auch noch irgendwie mit ab, wie die Struktur genau aussieht, sprich: Welches Element sich in welchem Element befindet. Sollte z.B. eienr der B-Tags nicht geschlossen worden sein, bevor das DIV-Tag geschlossen wird, muss an dieser Stelle nachgesteuert werden. Im Grunde genommen ist es nicht ganz sooo schwierig, auch wenn ich mir das jetzt noch deutlich einfacher vorstelle, als es in Wirklichkeit ist. Dennoch aber keine unlösbare Aufgabe.

Da ich die Methode aber auch für meine BB-Codes interessant finde und vorher garnicht darüber nachgedacht habe, werde ich mich in naher Zukunft auch mal damit befassen
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.10.2007, 16:23 Nach oben    #6
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 690
Standard

Zu meinem vorherigen Posting: Schau mal bitte in folgenden Thread, da wird eine Methode von RegEx vorgestellt, die mir bislang noch nicht bekannt war, für die Verarbeitung von HTML-Code jedoch sinnvoll sein könnte: BBCode "noparse"
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.11.2007, 18:25 Nach oben    #7
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.208
Standard

Hatte den Thread etwas aus den Augen verloren, fürs erste werde ich wohl versuchen mit dem purifier das ganze zu lösen, das einmalige parsen eines geschriebenen Kommentars sollte nicht das Problem sein, er wird dann ja auch so gespeichert, also keine Option unter der die Performance sonderlich leidet, in Kombination mit Tidy dürfte das auch validen Code ausspucken.
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.11.2007, 22:33 Nach oben    #8
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

Am einfachsten du erstellst aus der eingabe ein DOMDocument und validierst das dann gegen ein Schema, Relax NG oder DTD.

Da hast du kaum Aufwand, 99,999%ige Sicherheit und ist beliebig erweiterbar.

MfG Tom

Geändert von Byrel (01.11.2007 um 22:39 Uhr)
Byrel ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.11.2007, 22:57 Nach oben    #9
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.208
Standard

Zitat:
Zitat von Byrel Beitrag anzeigen
Am einfachsten du erstellst aus der eingabe ein DOMDocument und validierst das dann gegen ein Schema, Relax NG oder DTD.

Da hast du kaum Aufwand und ist beliebig erweiterbar.

MfG Tom
Die Frage ist wo ich das einbauen kann/soll, ich will ja erstmal ungewollten/unerlaubten kram rausbekommen das mache ich wohl mit dem purifier, da ich das dort wohl am einfachsten verwalten kann und da purifier eine eigenen art implementierung ähnlich tidy hat oder auch wenn vorhanden direkt tidy nutzen kann, kann ich damit eine überprüfung einbauen, damit hätte ich alle teile zusammen.

Validierung an einer vorhandenen DTD würde ja dann auch nur funktionieren wenn ich wieder ein komplettes Dokument habe (was der Kommentar ja nicht ist), anderfalls müsste ich ja eine eigene DTD definieren die auf der verwendeten des kompletten Dokuments (xhtml strict oder transitional) basiert aber nur den Teil innerhalb eines DIVs validiert (geht das überhaupt ?).

Die Frage die sich mir da jetzt stellt, habe ich da dann auch zusätzlich zu der Möglichkeit der Validierung beim scheitern die Möglichkeit einer "Filterung" ? Also ich will nicht nur wissen ob der Kommentar meiner DTD (schon) entspricht, sondern ich will sie so filtern, dass sie zu der DTD passen, sonst muss ich da ja auch wieder auf was anderes zurückgreifen und dann bringt es mir keinen Mehrwert, dann kann ich auch bei purifier ( + tidy ) bleiben weil ich damit theorhetisch validierung + filterung habe.

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.11.2007, 17:39 Nach oben    #10
Benutzer
 
Registriert seit: 24.10.2006
Beiträge: 90
Standard

du kannst den input validieren. du kannst input filtern und zwar gegen eine whitelist. gleich wie der html purifier, nur da du ja der meinung bist dass das zu groß ist und auf die performance geht, hab ich dir eben das vorgeschlagen.

Nur solltest du austesten wie schnell er ist und wenn ich davon ausgehe, dass es für deinen Blog ist dann dürfte Performance ja keine Role spielen, weil dein Blog soweit ich das einschätzen kann, nicht besonders frequentiert (100 Seitenaufrufe / Tag ?) und kaum kommentiert ist und wenn da mal alle paar Tage wer einen Eintrag macht, wirst du nix davon merken...

also bei so kleinen Blogs / Homepages braucht man sich über Performance (Code Optimierung, Caching etc.) überhaupt keine Gedanken machen ...

EDIT:
Ja du brauchst ja keine vorhandene DTD du kannst dir ja schnell selbst eine basteln, wo du sagst strong, em, img (mit attributen src und alt), u, p dürfen verwendet werden und fertig. Das is net 6 Zeilen DTD oder so und macht kaum Aufwand und dann kannst du das mit simpelxml (LIBXML_DTDVALID) oder DomDocument ($doc->valid()) validieren. Du müsstest halt noch einen wurzelknoten und so hinzufügen aber das is ja nicht der rede wert...

MfG Tom

Geändert von Byrel (02.11.2007 um 17:42 Uhr)
Byrel ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.11.2007, 15:48 Nach oben    #11
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.208
Standard

Also nach ein paar Tests mit Purifier bin ich davon erstmal abgekommen, die Funktionalität + das Ergebnis überzeugen, aber 0,8 Sekunden NUR für das Includen der benötigten Klassen ist einfach zu lange, das fällt einfach auf.

Bin dann aber noch auf htmLawed gestoßen, was im gesamten ein gutes Stück kleiner ist, und zusammen mit tidy gut funktioniert und insgesamt (includes + testcode) nur < 0.08s braucht.

Hier ein bißchen Beispielcode für jeden den es interessiert:

PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
    <head>
        <title>test</title>
    </head>
    <body>
        <div>
<?php
$configTidy 
= array(
                   
'indent'        => true// indent code
                   
'add-xml-decl' => false// dont add < ?xml ... ? > because IE can't handle it right
                   
'output-xhtml'  => true// output xhtml
                   
'wrap'          => 500// wrap after 500 chars
                   
'markup'        => true// nicer output
                   
'language' => 'de'// language
                   
'indent-attributes' => false// indent attributes
                   
'output-xml'         => false// output wellformed xml
                   
'break-before-br' => true// linebreak before a <br />
                   
'force-output' => true// output too when errors occured
                   
'logical-emphasis' => true// <i> -> <em>, <b> -> <strong>
                   
'fix-uri' => false// auto escape signs in urls
                   
'drop-proprietary-attributes' => true// drop unwanted attributes (ex MS-Office-Stuff)
                   
'bare' => true// another MS-Office-Thrash fix
                   
'word-2000' => true// remove word-html-thrash
                   
'alt-text' => 'no alt tag given'// standard-alt-tag
                   
'wrap-sections'     => false,
                   
'char-encoding' => 'utf8',
                   
'input-encoding' => 'utf8',
                   
'output-encoding' => 'utf8'
                   
'accessibility-check' => 0// dont perform check
                   
'show-body-only' => true// don't add complete document (doctype, html, head, body ... ) 
                   
'doctype' => 'strict' // use strict-doctype
                   
);

require_once(
'htmLawed.php');
$code 
'<p href="http://www.domain.de">Testtext</p><br />
<strong>Strong text</strong><br />
<em>Strong text</em><br />
<div style="height: 200px; width: 400px; background-color: red;">Test</div><br />
<ul>
<li><a href="http://www.heise.de">Mein Link</a></li>
<li><a href="javascript:alert(\'xss\')">Link2</a></li>
</ul>
'
;
$configHtmLawed = array(
                    
'valid_xhtml' =>  1// valid xhtml
                    
'balance' =>  1// fix bad nesting
                    
'keep_bad' =>  0,  // remove bad tags keep their content
                    
'base_url' => 'http://www.robo47.net'// base-url
                    
'cdata' =>  1// remove cdata
                    
'comment' =>  1//remove comments
                    
'css_expression' =>  1// remove style=""
                    
'elements' => 'p, strong, em, blockquote, dfn, abbr, q, del, ins, acronym, cite, ul, li, ol, img, a, pre, br'// allowed tags
                    
'lc_std_val' =>  1// lowercase tags + attributes
                    
'make_tag_strict' =>  2//transform deprecated tags to new, if no new remove
                    
'no_deprecated_attr' =>   2// transform deprecated attributes to new, if no new remove
                    
'parent' => 'div'// what will be the parent element
                    
'deny_attribute' => '*+src+href+title+cite+alt',  // forbid all, allow src, href, title, cite, alt
);
$var htmLawed($code,$configHtmLawed);
$tidy = new Tidy();
$tidy->parseString($var$configTidy);
$tidy->diagnose();
echo 
$tidy;
?>
</div>
</body>
</html>
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.11.2007, 22:08 Nach oben    #12
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Du kannst dir auch mal HTML_Safe anschauen. Hatte es vor kurzen eingesetzt und bin recht zufrieden. Wie die Prefomence ist kann ich jetzt nicht sagen...
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Merkwürdiges HTML ex³ Plauderecke 8 24.10.2006 16:41
Passwort und Name als Input Vorgabe ex³ PHP-Programmierung 22 07.02.2006 17:55
HTML in HTML einbinden mr1st HTML, XML und CSS 3 14.01.2006 16:19
include -> html -> php/html Julied64 PHP-Programmierung 2 03.09.2005 12:35
HTML Code im Frame darstellen ? tuxsymptom Desktop-Applikationen und Grafik 5 03.01.2005 19:42


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45