php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.08.2010, 09:58  
DerApfel
Gast
 
Beiträge: n/a
Standard BBCode - HTML-Umwandlung und XSS-Protection

Hallo,

aktuell arbeite ich für meine Issue-Tracker-Applikation an den Eingabeformularen für Benutzer. Um XSS grundsätzlich zu vermeiden habe ich bereits von Anfang an auf BBCodes gesetzt. Nun habe ich aber festgestelllt, dass meine Klasse trotz allem nicht 100% sicher ist, kann den Fehler jedoch selbst nicht finden.

Es geht mir darum, dass aus dem BBCode HTML generiert wird und das es keine Angriffe durch XSS geben kann.

PHP-Code:
<?php
class bbcode
{
    public static function 
parseToHTML($input)
    {
        
$input htmlentities($inputENT_QUOTES);
        
$input strip_tags($input);
        
$input str_replace("[b]""<b>"$input);
        
$input str_replace("[/b]""</b>"$input);
        
$input str_replace("[i]""<i>"$input);
        
$input str_replace("[/i]""<i>"$input);
        
$input str_replace("[u]""<u>"$input);
        
$input str_replace("[/u]""</u>"$input);
        
$input str_replace('\r\n',"<br>",$input);
        
$input str_replace('\r',"<br>",$input);
        
$input str_replace("[img]../../js/""[img]/js/"$input);
        
$input preg_replace('/\[url=([^() ]+).*\]([^\]].*)\[\/url\]/''<a href="$1">$2</a>'$input);
        
$input preg_replace('/\[color=([^ ]+).*\]([^\]].*)\[\/color\]/''<font color="$1">$2</font>'$input);
        
$input preg_replace('/\[img\]([^\]].*)\[\/img\]/''<img src="$1" />'$input);
        
$input preg_replace('/\[quote\]([^\]].*)\[\/quote\]/''<div class="quote">$1</div>'$input);
        
$input preg_replace('/\[code\]([^\]].*)\[\/code\]/''<div class="code">$1</div>'$input);
        
$input str_replace("[img]"'<img src="'$input);
        
$input str_replace("[/img]"'" />'$input);
        
$input str_replace("]<img"'"><img'$input);
        
$input str_replace('[/img">''" />'$input);
        
$input str_replace('javascript:'''$input);
        return 
$input;
    }
}
Danke im Voraus,
Simon Strasser
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.08.2010, 10:29  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 1.721
PHP-Kenntnisse:
Fortgeschritten
fab ist einfach richtig nettfab ist einfach richtig nettfab ist einfach richtig nettfab ist einfach richtig nett
Standard

Zitat:
Zitat von DerApfel Beitrag anzeigen
Nun habe ich aber festgestelllt, dass meine Klasse trotz allem nicht 100% sicher ist, kann den Fehler jedoch selbst nicht finden.
Und wie hast du das festgestellt? Irgendeinen Anhaltspunkt musst du doch selber haben.
fab ist gerade online   Mit Zitat antworten
Alt 18.08.2010, 10:41  
DerApfel
Gast
 
Beiträge: n/a
Standard

Es ist z.B. nach wie vor möglich onclick="" zu setzen. Natürlich könnte ich jetzt onclick="" rausfiltern, was jedoch auch nur begrenzt helfen würde, da es ja noch mehr von der Sorte gibt.

Des Weiteren habe ich irgendetwas über Encoding-Zeugs gehört, welches meine Abfragen umgehen würde, jedoch im Browser des Users wieder korrekt angezeigt werden würde. - Da ich jedoch nicht mehr weiß, wo ich das gelesen hatte, habe ich die Hoffnung das jemand aus dem Forum es wissen könnte.
  Mit Zitat antworten
Alt 18.08.2010, 10:53  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 921
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Eine Sammlung möglicher Angriffsvektoren findet sich z.B. hier XSS (Cross Site Scripting) Cheat Sheet. Aber die Frage von fab bleibt natürlich: Welcher Vektor ist dir denn aufgefallen, der nicht verhindert wird?
__________________
Wir suchen PHP / Delphi und .NET Entwickler im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 18.08.2010, 10:55  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 1.721
PHP-Kenntnisse:
Fortgeschritten
fab ist einfach richtig nettfab ist einfach richtig nettfab ist einfach richtig nettfab ist einfach richtig nett
Standard

Kritisch sind da deine URL, COLOR und IMG Codes. Z.B. lassen sich hier

Code:
([^() ]+)
Tabulatoren oder Zeilenumbrüche als Whitespace einschmuggeln (Den Sinn von .* hinter dem geklammerten Ausdruck bezweifle ich auch aber das verarbeitest du zumindest nicht)

Um sämtliche Whitespaces zu verbieten, ändere es so:

Code:
(\S+)
(warum eigentlich keine Klammern in der URL?)

Edit: Anführungszeichen musst du natürlich auch ausschließen, allerdings filterst du die ja schon vorab mit htmlentities, eine Ahnung, wie sie trotzdem hindurchkommen konnten?

Geändert von fab (18.08.2010 um 10:58 Uhr).
fab ist gerade online   Mit Zitat antworten
Alt 18.08.2010, 11:21  
DerApfel
Gast
 
Beiträge: n/a
Standard

Klammern habe ich verboten, um folgende Konstrukte zu verhindern:
Code:
<a href="javascript:alert('hi');">Blub</a>
Auch wenn das Javascript herausgefiltert wird, gäbe es ja z.B. noch hundert andere schreibweisen oder eben diesen encoding-zeugs? (Kennt sich jemand damit aus? )
  Mit Zitat antworten
Alt 18.08.2010, 11:22  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Ich würde genau umgekehrt vorgehen. Also statt einer Blacklist eine Whitelist benutzen, das ist sicherlich der sicherere Weg.
cycap ist offline   Mit Zitat antworten
Alt 18.08.2010, 11:28  
DerApfel
Gast
 
Beiträge: n/a
Standard

Wie genau sollte so eine Whitelist aussehen? ô0 Effektiv möchte ich ja im Text selbst alle Sonderzeichen erlauben, nur hald niemals so, dass dabei HTML-Tags entstehen könnten oder das bei BBCodes XSS betrieben werden kann.
  Mit Zitat antworten
Alt 18.08.2010, 11:33  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 1.721
PHP-Kenntnisse:
Fortgeschritten
fab ist einfach richtig nettfab ist einfach richtig nettfab ist einfach richtig nettfab ist einfach richtig nett
Standard

Ersteres machst du ja schon mit htmlentities. Also brauchst du nur für Tags wie URL eine Whitelist, also z.B. dass URLs nur mit (https?|ftp|mailto) beginnen dürfen. Damit hast du javascript:... ausgeschlossen und valide URLs mit Klammern funktionieren trotzdem wie sie sollen. Das selbe gilt für IMG. Und COLOR braucht eigentlich nur [#a-z0-9]
fab ist gerade online   Mit Zitat antworten
Alt 18.08.2010, 11:49  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Wenn du eine Whitelist für Tags und eine Whitelist für Attribute anlegst, begrenzt du die Angriffsmöglichkeiten enorm. Zum Beispiel solche Sachen wie onclick, onload etc. würden von vornherein nicht in deinen HTML Code landen.

Wenn du dann noch Attribute brauchst die als Inhalt schädliche Sachen enthalten können, zum Beispiel "href", dann kannst du den Inhalt noch entsprechend validieren und dann solltest du eigentlich alles abgefrühstückt haben.
cycap ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Doppelter E-Mail versand include21 PHP Tipps 2010 3 06.05.2010 15:47
HTML im Kontaktformular sperren? Flo194 PHP Tipps 2010 11 16.02.2010 21:23
[Erledigt] Eigener BBCode mit mehreren Optionen - Fehler Arego PHP Tipps 2009 8 09.03.2009 18:00
html formular mit einer php mail funktion basti-erfurt Scriptbörse 3 07.12.2008 15:21
[Erledigt] HTML Mail mit Lücken mitten in den Worten, wie kommt das? DeeFour PHP-Fortgeschrittene 2 29.05.2008 15:47
Variable und komplette HTML Datei chrisonline PHP Tipps 2007 3 24.05.2007 15:30
BBCode mit eregi_replace(); ändert nur letztes Vorkommen Blank PHP Tipps 2006 6 12.04.2006 14:58
[Erledigt] &amp;amp;lt;if&amp;amp;gt; &amp;amp;lt;/if&amp;amp;gt; in einer HTML Datei fuer Templatesy PHP-Fortgeschrittene 6 03.11.2005 12:05
Kontaktformular, welches auf neue html Seite führt PHP Tipps 2005-2 4 20.07.2005 11:21
[Erledigt] HTML Tabellenzeile in Tabelle einfügen? Datenbanken 2 28.01.2005 00:28
IMAP: Bild(er) in HTML Part richtig darstellen PHP-Fortgeschrittene 1 07.10.2004 12:21
{$varname.optelement} mit preg_match aus HTML extrahieren PHP Tipps 2004 0 11.09.2004 04:13
Unterschied HTML und PHP PHP Tipps 2004 4 28.08.2004 19:02
Validitor (HTML 4.01) = Schwachsinn? Filewalker Off-Topic Diskussionen 19 03.08.2004 15:27
[Erledigt] PDF aus HTML erzeugen ? PHP-Fortgeschrittene 2 05.06.2004 02:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
xss bbcode, xss protection php, bbcode url xss preg_replace, php xss protection, bbcodes xss, xss protection, bbcode javascript: in href verbieten, xss str_replace umgehen, php bbcode in html, php class xss protection, bb code xss, php xxs, xss bb code, bbcode xss, tabelle in bbcode umwandeln, tabellen in bbcode umwandeln, cross site scripting php class, input str_replace, bb code und xss, html bbcode umwandeln bilder

Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum