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?