Ergebnis 1 bis 3 von 3

Thema: Clientseitiger XSS Schutz per JavaScript

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Avatar von Worka
    Registriert seit
    21.05.2007
    Beiträge
    973

    Clientseitiger XSS Schutz per JavaScript

    Hallo
    Ich möchte hier mal ein Script vorstellen, welches ich vor ein paar Tagen gebastelt habe.

    Zum Hintergrund:
    Als JS Coder kennt man das Problem von XSS. In den letzten Tagen sind mir wieder viele Scripte untergekommen, welche XSS anfällig sind.
    Natürlich sollte man, seine Scripte serverseitig gegen sowas absichern. Dennoch kommt es immer wieder vor, dass Scripte XSS anfällig sind.
    Daher habe ich überlegt, inwiefern man Clientseitig sowas vorbeugen kann.

    Clientseitigen XSS Schutz, kennt jeder moderne Browser. Jedoch kann ein Browser nicht vor allen Angriffen schützen, da er nicht genau weiss, welche Scripte im Quelltext nun vom Seitenbetreiber eingefügt wurden, und welche der "böse XSS Hacker" eingefügt hat.

    Hier greift mein Script ein, welches am besssten direkt als erstes Tag im html Head eingefügt werden sollte. In dieser ersten noch SEHR unausgereiften Tech Demo Version tut es folgendes:

    1. Stoppt das Laden der Seite :
    --> Keine weiteren Scripte werden geladen.

    2. Lädt die URL des aktuellen Documentes per AJAX Request:
    --> HTML Quelltext der Seite, dessen Laden abgebroche wurde, wird in String gespeichert.

    3. Fügt Antwort (= HML Code der Seite) so in das Document ein, dass Scripte zwar im DOM aufgenommen aber NICHT ausgeführt werden.
    --> Scripte werden über das DOM auffindbar.

    4. Durchsuch alle gefundenen Scripte ob sie oder ihre src in der Whitelist stehen.
    --> Führt erlaubte aus, ignoriert nicht erlaubte.

    Natürlich ist das Script noch sehr unausgereift, kann aber verbesssert werden.

    1. Es erfordert immer 2 Requests pro Seite, da der erste Request abgebrochen wird, sobald das Script geladen wurde und anschliessen der HTML Code per XMLHttp geladen wird.
    --> Man könnte alle Links welche zu Documenten auf dem selben Host führen gegen "AJAX Links" austauschen, so dass alle Links per AJAX geladen werden und die Antwort als neuer HTML Code eingetragen wird.

    2. Erfolgt der Aufruf der Seite mit Post Parametern, so werden diese beim AJAX Request nicht gesendet.
    --> Alle Forms könnten dynamisch so geändert werden, dass sie per AJAX Ihren Request absenden. Die Antwort wird dann als neuer HTML Code eingefügt.

    3. Alle Scripte bzw. Ihre src welche erlaubt werden sollen müssen in der Whitelist aufgenommen werden.

    4. Funktionsweise des Scriptes ist Browserabhängig.
    --> Es funktioniert scheinbar im jeweils neuesten IE/FF/Chrome/Opera

    5. Alle Funktionen wurden nur exemplarisch Implementiert


    Demo:
    http://worka.designerscripte.net/WAAXE/WAAXE.html

    Code:
     
    //Exemplarische Whitelist
    var WhiteList = 'alert(123)alert(12)';
    
    
    (function WAAXE(){
            
        var WhiteListed = function(Code){
            if (WhiteList.indexOf(Code) >= 0) {
                alert('Es wurde folgendes Script gefunden und es wird nun erlaubt: ' + Code);
                return true;
                
            }else{
                alert('Es wurde folgendes Script gefunden und es wird nun verboten: ' + Code);
                return false;
            }
        };
        
        
        var ExecScript = function(Node) {
            var newNode = document.createElement('script'), parentNode = Node.parentNode;
            newNode.src = Node.src;
            parentNode.removeChild(Node);
            parentNode.appendChild(newNode);
        };
        
        
        
        //Seitenladen Stopen
        if(window.stop){
            window.stop();
        }else{
            document.execCommand('stop')
        };
        
        //SeitenURL per AJAX anfordern
        this.xmlHttp = new XMLHttpRequest();
        xmlHttp.open('GET', window.location.href + window.location.search, true);
        
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4) {
                //HTML einfügen
                var newHtml = document.createElement('html'), oldHtml = document.getElementsByTagName('html')[0], parentNode = oldHtml.parentNode, body = document.createElement('body');
                body.innerHTML = xmlHttp.responseText;
                newHtml.appendChild(body);
                parentNode.removeChild(oldHtml);
                parentNode.appendChild(newHtml);
                
                
                //Scripte suchen und prüfen
                var scripts = document.scripts;
                for (var i=0, len = scripts.length; i < len; i++) {
                    if (scripts[i].src && scripts[i].src != '') {
                        if ( WhiteListed(scripts[i].src) == true) {
                            ExecScript(scripts[i]);
                        }
                       
                    }else if(scripts[i].innerHTML && scripts[i].innerHTML != '') {
                        if ( WhiteListed(scripts[i].innerHTML) == true ) {
                            eval(scripts[i].innerHTML);
                        }
                    }
                    
                }
            }
        };
        xmlHttp.send(null);
    })();
    Ist das nur eine nette Spielerei oder seht Ihr Sinn in einer Weiterentwicklung dieses Scripts?
    StGB § 328 Absatz 2.3: Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.

  2. #2
    Erfahrener Benutzer Avatar von jpwfour
    Registriert seit
    06.02.2008
    Beiträge
    3.717
    Zitat Zitat von Worka Beitrag anzeigen
    ...
    Natürlich sollte man, seine Scripte serverseitig gegen sowas absichern. ...
    1. Stoppt das Laden der Seite :
    ...
    Ist das nur eine nette Spielerei oder seht Ihr Sinn in einer Weiterentwicklung dieses Scripts?
    Kann man so machen, aber allein der Performanceverlust ist hier für viele denke ich schon ein K.O. Kriterium. Dann lieber die "Energie" in die serverseitige Absicherung stecken (der Client sollte mit sowas eh nicht belastet werden, dass sind bisher auch nur "dirty hacks", die aus der Not entstanden sind. Leider entwickelt sich das dann schnell weiter, plötzlich benutzt es jeder und sieht es als i.O. an, dem Client solche Dinge zu überlassen ).
    Kill one man, and you are a murderer.
    Kill millions of men, and you are a conqueror.
    Kill them all, and you are a god.
    - Jean Rostand, Thoughts of a Biologist (1939)

  3. #3
    Moderator Avatar von Worka
    Registriert seit
    21.05.2007
    Beiträge
    973
    Das zweifache laden der Seite wäre beim umschreiben der Links (Link href gegen AJAX Request ersetzen und Quellcode nach Request ersetzen) nur beim ersten Aufruf nötig.

    Das Argument mit der Zuständigkeit ist natürlich verständlich.
    Leider scheint der Verzicht auf sowas aber die Coder auch nicht zum sicheren Scripten anzuregen.
    StGB § 328 Absatz 2.3: Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.

Ähnliche Themen

  1. Hoster mit dos Schutz gesucht
    Von back4ever im Forum Webspace- & Serveranbieter
    Antworten: 5
    Letzter Beitrag: 24.03.2010, 16:49
  2. [HTML/CSS/JS] PHP Funktionen in Javascript
    Von jpwfour im Forum [HD] Programmieren
    Antworten: 1
    Letzter Beitrag: 06.11.2009, 19:49
  3. Neue Spezialeinheit der US-Army zum Schutz vor Cyber-Attacken
    Von Newsbot im Forum Talk, talk, talk...
    Antworten: 0
    Letzter Beitrag: 29.10.2008, 11:00
  4. CSS uns JavaScript cachen
    Von Benutzer1699 im Forum [HD] Programmieren
    Antworten: 1
    Letzter Beitrag: 30.05.2008, 14:59
  5. Schutz gegen Klick-Bots fürs vms2 - Lösung hier, wer setzt es um?
    Von Gnarf im Forum Weiterentwicklung Basisscript
    Antworten: 10
    Letzter Beitrag: 26.05.2007, 18:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •