php.de

Zurück   php.de > Lösungen durch Skripte > Scriptbörse

Scriptbörse PHP Lösungen für nen schmalen Taler

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.02.2011, 14:43  
Benutzer
 
Registriert seit: 03.04.2009
Beiträge: 66
Donald befindet sich auf einem aufstrebenden Ast
Standard Tipp: gefährliche Attribute aus Tags entschärfen (XSS verhindern)

Hallo,

man kann eine auszugebende HTML Menge ja recht gut mit striptags() säubern. Aber manchmal geht das eben nicht gut, weil man einige Tags durchaus gut findet. Natürlich kann man die guten Tags stehen lassen, aber was passiert, wenn ein <img>-Tag nebenbei das macht:

Code:
<img src="notknown.jpg" onerror="alert(1);">
Dann kann das Bild nicht geladen werden und das onerror-Attribut wird getriggert. Schon läuft JavaScript...

Das selbe gilt theoretisch für alle Attribute in allen Tags. Daher hab ich eine Filter-Routine gemacht, welche hier mehr Sicherheit schafft.

ACHTUNG: Das bietet keine alleinige Sicherheit! Man muss Tags wie zB <script> noch selbst entfernen (Tipp: striptags() Funktion von PHP). Es macht dann Sinn, wenn man bestimmte Tags (zB <form>, <input >, <img > etc.) behalten möchte. In dem Fall kann man mit dieser Funktion die verbliebenen Tags ganz einfach unschädlich machen.

Will das nicht vorenthalten, also bitte:

PHP-Code:
/**
* Replaces all dangerous attributes from the html-tags in this document.
* Example:
* <img src="a.jpg" onerror="alert(1)" onload="alert(1)"> will get
* <img src="a.jpg" s5T38IwgH="alert(1)" s5T38IwgH="alert(1)">
*
* @param string $input document to clean
* @return string clean document
*/
function secureHTMLAttributes($input) {
    
// this attributes will get neutralized
    
$Attributes = Array("onabort""onblur","onchange","onclick""ondblclick","onerror","onfocus""onkeydown",
                        
"onkeypress","onkeyup","onload","onmousedown","onmousemove","onmouseout","onmouseover",
                        
"onmouseup","onreset","onselect","onsubmit","onunload","javascript:","javascript :",
                        
"eval""script:""script :");

    
$output "";
    for (
$i=0;$i<=strlen($input);$i++){
        
$char substr($input$i1);

        if (
$char == ">") { $inside $inside 1; }

        if (
$inside 1) {
            if (
$found != "") {
                
// check the content of the tag
                
$found str_ireplace($Attributes"s".GenerateCode(6), $found);
            }
            
$output .= $found $char;
            
$found "";
        } else {
            
$found .= $char;
        }

        if (
$char == "<") { $inside $inside 1; }
    }

    return 
$output;

Und hier noch der Code für den verwendeten Zufallsgenerator:
PHP-Code:
function GenerateCode($Length) {
    
$Code "";
    for (
$x 1$x <= $Length$x++) {
        if (
rand(1,100) < 51 ){
            
// number
            
$Code $Code rand(0,9);
        } else {
            
// char
            
if (rand(1,100) < 50) {
                
// lowercase
                
$Zeichen strtolower(chr(rand(65,90)));
                
$Code $Code $Zeichen;
            } else {
                
// uppercase
                
$Zeichen chr(rand(65,90));
                
$Code $Code $Zeichen;
            }
        }
    }
    return 
$Code;


Die folgenden Attribute werden innerhalb von beliebigen Tags entschärft, indem sie durch Zufallsbezeichner ersetzt werden:
onabort (bei Abbruch)
onblur (beim Verlassen)
onchange (bei erfolgter Änderung)
onclick (beim Anklicken)
ondblclick (bei doppeltem Anklicken)
onerror (im Fehlerfall)
onfocus (beim Aktivieren)
onkeydown (bei gedrückter Taste)
onkeypress (bei gedrückt gehaltener Taste)
onkeyup (bei losgelassener Taste)
onload (beim Laden einer Datei)
onmousedown (bei gedrückter Maustaste)
onmousemove (bei weiterbewegter Maus)
onmouseout (beim Verlassen des Elements mit der Maus)
onmouseover (beim Überfahren des Elements mit der Maus)
onmouseup (bei losgelassener Maustaste)
onreset (beim Zurücksetzen des Formulars)
onselect (beim Selektieren von Text)
onsubmit (beim Absenden des Formulars)
onunload (beim Verlassen der Datei)
javascript: (bei Verweisen)
script:
eval


Achtung, das arbeitet auch innerhalb von HTML Kommentaren etc. Das sollte bei der Ausgabe aber ja nicht stören...

Wenn es jemand erweitern oder verbessern möchte, dann gerne Bitte hier untendran posten.

Donald

Geändert von Chriz (11.02.2011 um 18:26 Uhr). Grund: Präfix eingefügt
Donald ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.02.2011, 14:47  
Erfahrener Benutzer
 
Registriert seit: 19.05.2008
Beiträge: 612
PHP-Kenntnisse:
Fortgeschritten
Young Jedi befindet sich auf einem aufstrebenden Ast
Standard

Ehöö, wenn ich das richtig verstehe, wird aus <img src="" onblur="" /> ein <img src="" fdwef="" /> ... aua, das tut doch jeden Validator weh... Wieso dann nicht gleich entfernen.

Außerdem gibt es doch schon weitaus komplexere Filterklassen: http://htmlpurifier.org/
__________________
http://tippsgegenlangeweile.de

Young Jedi ist offline   Mit Zitat antworten
Alt 11.02.2011, 14:51  
Erfahrener Benutzer
 
Registriert seit: 19.05.2008
Beiträge: 612
PHP-Kenntnisse:
Fortgeschritten
Young Jedi befindet sich auf einem aufstrebenden Ast
Standard

Achso außerdem wirft das Script bei mir haufen Notices und was bringt es mir, wenn Sachen, die direkt JS einbinden, z.B. '<script>...</script>' drinnen lässt?
__________________
http://tippsgegenlangeweile.de

Young Jedi ist offline   Mit Zitat antworten
Alt 11.02.2011, 14:52  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Man sollte ganz einfach kein HTML erlauben! Wenn du bestimmte Formatierungen oder ähnliches ermöglichen willst dann nutz BBCodes. Ansonsten wäre mir das Risiko viel zu groß dass irgendwo eine XSS Lücke entstehen könnte. Bei deinem Skript würd ich auch nicht 100% sagen das es sicher ist ...
Flor1an ist offline   Mit Zitat antworten
Alt 11.02.2011, 14:56  
Benutzer
 
Registriert seit: 03.04.2009
Beiträge: 66
Donald befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

es soll ja nicht die Tags entfernen (das können andere Funktionen besser). Das ist nicht Sinn der Routine, deshalb ist der Name auch secureHTMLAttributes(). Und ja, das macht Tags draus, die ein Validator nicht mag (weil er die nicht kennt). Allerdings führt die auch kein Browser aus, und damit werden diese unschädlich. Das Validator-Thema ist der Preis dafür.

Den htmlpurifier kenne ich, aber das ist mit Kanonen auf Spatzen geschossen. Ich wollte nur die gefährlichen Attribute entschärfen. Und das macht die Routine. striptags kann doch jeder nach eigenem Gusto selbst verwenden...

Es ist nur ein Teil eines Sicherheits-Konzeptes, keine AllesInAllem Lösung (hab ich aber auch nicht so verkauft)!

[EDIT] Vielleicht nochmal zum Verständnis: Das ist keine Funktion, die man alleine zur Absicherung nutzen kann. Es ist ein Bestandteil, der XSS aus Tag-Attributen verhindern soll!

Zweite Anmerkung: Das ist ja nicht für regulären HTML-Code gedacht, sondern für Fälle in denen Daten von Usern ausgegeben werden sollen. Und um hier einen Schutz einzubauen sollte man Tags filtern und, für den Fall dass man manche Tags beibehalten möchte, diese Routine von mir verwenden.

Hab jetzt oben einen Hinweis eingefügt![/EDIT]

Donald

Geändert von Donald (11.02.2011 um 15:05 Uhr).
Donald ist offline   Mit Zitat antworten
Alt 11.02.2011, 15:01  
Erfahrener Benutzer
 
Registriert seit: 19.05.2008
Beiträge: 612
PHP-Kenntnisse:
Fortgeschritten
Young Jedi befindet sich auf einem aufstrebenden Ast
Standard

Ja das stimmt ja, aber was für einen Sinn hat es, das Attribut zu maskieren? Da kann es doch auch gleich entfernt werden.

Außerdem würde ich immer eine Whitelist anstatt einer Blacklist verwenden. Was ist, wenn in 2 Jahren ein neues Attribut Namens onSomethingNew dazukommt?

Desweiteren ist es, wie gesagt, trotz allem nicht sicher: <script> und ähnliche "Javascripteinleiter" kann verwendet werden. Und auch das href Attribut kann Javascript ausführen.
__________________
http://tippsgegenlangeweile.de

Young Jedi ist offline   Mit Zitat antworten
Alt 11.02.2011, 15:10  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Warum sollte man den seinen Benutzern ein paar wenige HTML Tags zulassen? Wieso dann nicht gleich BBCode nutzen und somit nicht mehr die Probleme zu haben.
Flor1an ist offline   Mit Zitat antworten
Alt 11.02.2011, 15:11  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Donald Beitrag anzeigen
Und ja, das macht Tags draus, die ein Validator nicht mag (weil er die nicht kennt). Allerdings führt die auch kein Browser aus, und damit werden diese unschädlich. Das Validator-Thema ist der Preis dafür.
Schon allein damit - absolutes fail.
Fehlerhaftes HTML erstellen, um die Sicherheit zu erhöhen - absoluter Unfug.
Zumal theoretisch nicht ausgeschlossen ist, dass deine „Zufallsfunktion“ wiederum Attribute erstellt, die es in HTML tatsächlich gibt - und damit sogar den Sinn des HTML-Codes entscheidend verändern könnte.

Zitat:
Wenn es jemand erweitern oder verbessern möchte, dann gerne
Das ist schon vom Konzept her totaler Quark.
Daher, die einzig angebrachte „Verbesserung“: Tonne auf, Script rein, Tonne zu.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 11.02.2011, 15:26  
Erfahrener Benutzer
 
Registriert seit: 23.03.2010
Beiträge: 626
PHP-Kenntnisse:
Anfänger
ByStones befindet sich auf einem aufstrebenden Ast
Standard

Code:
<a title=">" href="javascript:alert('XSS');">Klick</a>
Geht unbeschadet durch deine Sicherung durch...

Code:
<img title=">"  alt="" src="gibtsnet.png" onerror="alert('XSS')" />
Das Ganze geht auch ohne das der User was machen muss...

Fazit: Dein Code ist suboptimal...
__________________
Signatur:
PHP-Code:
$s '0048656c6c6f20576f726c64';
while(
$i=substr($s=substr($s,2),0,2))echo"&#x00$i;"

Geändert von ByStones (11.02.2011 um 15:33 Uhr).
ByStones ist offline   Mit Zitat antworten
Alt 11.02.2011, 15:37  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Schau mal: In diesem Forum kann man ganz schlimme Sachen posten, und dennoch passiert nichts:

<script alert('XSS')>

Und dabei kannte der Programmierer deine Funktion noch gar nicht...
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla 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
HTML-String auslesen bit4fox PHP Einsteiger 10 08.01.2011 16:33
verwandte Tags finden Simbo Datenbanken 10 07.12.2009 13:03
[Erledigt] pcre: Falsches Setzen von Tags verhindern PHP-Fortgeschrittene 3 26.10.2004 23:11
tags verhindern? PHP Tipps 2004 1 07.07.2004 17:22

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php xss verhindern, xss verhindern, xss javascript verhindern, xss php, php cross site scripting verhindern, php xss, xss tags, xss verhindern php, cross site scripting verhindern, javascript over included css php.de, gefährliche html-tags, javascript eval xss verhindern, php entschärfen, xss entschärfen, javascript xss verhindern, php attribute aus tags entfernen, xss vermeiden php, onclick-attribute, script tags javascript entfernen cross site, gefährliche html tags, php xss vermeiden

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:20 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