Firefox 3: Cross-Site-Scripting erlauben

  • Hi,

    auf einem Rechner, der keinen Internet-Zugang hat, wird Cross-Site-Scripting verwendet: Daten werden in einem Java-Script über AJAX von einem anderen Server abgerufen.


    Unter Firefox 2 wurde dafür bei about:config folgendes gesetzt:

    Zitat

    signed.applets.codebase_principal_support=true

    Im JavaScript code wurde der Zugriff freigeschaltet:

    Code
    netscape.security.PrivilegeManager.enablePrivilege("UniversalPreferencesWrite UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");

    So weit, so gut, funktioniert.

    Jetzt soll auf FireFox 3 geupdated werden. Dort funktioniert dieses Verfahren nicht mehr. Statt dessen erzeugt der Aufruf von XMLHttpRequest.open() folgende Fehlermeldung:

    Code
    [Exception... "Component returned failure code: 0x805e000a [nsIXMLHttpRequest.open]"  nsresult: "0x805e000a (<unknown>)"  location: "JS frame :: http://localhost/aww/php/vbtest.js :: GetData :: line 32"  data: no]

    Was muss ich unter FireFox3 machen, damit es wie unter FireFox2 funktioniert?

    Ciao
    Frank

  • Alternativen:
    Lass die Daten vom lokalen Webserver holen, der ist nicht an eine Same-Origin-Policy gebunden. Du rufst also ein lokales PHP-Skript auf, dass die Daten vom Intranet-Server besorgt und dann weiterreicht. Ein Aufruf von localhost von localhost aus wird generell nicht unterbunden.

    Signiere den JS-Code.

    Verwende JSON über script-Tags.

  • Hallo boardraider,

    danke für die Antwort.

    Zitat von boardraider

    Ein Aufruf von localhost von localhost aus wird generell nicht unterbunden.

    die Daten kommen tatsächlich von einem Mini-Webserver, der lokal läuft:

    Code
    var miniwebserver_url = "http://127.0.0.1:50080";


    erkennt FF3 nicht, das "127.0.0.1" identisch ist mit "localhost"? Dann würde ich die Scripte einfach abändern.

    Zitat von boardraider

    Signiere den JS-Code.

    OK, ich weiß, wie ich eine Mail signiere und ich bekomme es auch hin, ein MS-Excel Datei zu signieren, ebenfalls PDF Dateien habe ich schon signiert (ich besitze eine Signaturkarte mit qualifizierter Signatur)
    Aber eine einfache Textdatei (und darum handelt es sich ja bei den benutzen *.js JavaScript Dateien) habe ich noch nicht signiert.
    Gibt es dazu ein einfaches HowTo?

    Zitat von boardraider

    Verwende JSON über script-Tags.


    Bei einem anderen Projekt habe ich mal (unter PHP) einen AJAX Server gebaut, der die Antwort als JSON-String an das JS-Script zurückgeschickt hat.
    Ich verstehe nur nicht, was Du meinst? In wie weit kann mir JSON bei meinem Problem helfen?

    Ciao
    Frank

  • Zitat

    In wie weit kann mir JSON bei meinem Problem helfen?

    Im Gegensatz zu XMLHTTPRequests, die der Same-Origin-Policy unterliegen, gilt letztere nicht für die Einbindung externer Skripte über den script-Tag. Über dynamisch eingebundene Skripte lassen sich so die Barrieren der SOP aushebeln. Verbreite Frameworks bieten dafür auch bereits vorbereitetet Code.
    Eine von vielen Quellen dazu (Google wirft einiges aus, falls du dich weiter einlesen willst):
    http://www.ibm.com/developerworks/library/wa-aj-jsonp1/
    http://www.ibm.com/developerworks/library/wa-aj-jsonp2/
    Statt auf Frameworks zu setzen, kannst du natürlich das Ganze auch selbst implementieren, wenn es dir auf eigenständigen und schlanken Code ankommt.

    Zitat

    Aber eine einfache Textdatei (und darum handelt es sich ja bei den benutzen *.js JavaScript Dateien) habe ich noch nicht signiert.
    Gibt es dazu ein einfaches HowTo?


    Das Signieren von JS-Code ist eigentlich analog zum signieren von Mails oder anderen Dateiformaten. Als Ausgangspunkt für weitere Recherchen kannst du bei Mozilla reinlesen:
    http://www.mozilla.org/projects/secur…ed-scripts.html

    Zitat

    die Daten kommen tatsächlich von einem Mini-Webserver, der lokal läuft:

    Code
    var miniwebserver_url = "http://127.0.0.1:50080";

    erkennt FF3 nicht, das "127.0.0.1" identisch ist mit "localhost"? Dann würde ich die Scripte einfach abändern.


    Dass 127.0.0.1 identisch mit localhost ist, kann der Fx nicht wissen, da er keinen Reverse-Lookup für IP-Adresse macht. Ich hatte das bisher so verstanden, dass du vom lokalen Webserver die Seite beziehst und bei einem anderen Intranet-Server die Ajax-Daten und es dabei dann zu Problemen kommt. Wenn beides auf dem selben Server läuft, reicht es i.d.R. aus

    Code
    var miniwebserver_url = "http://localhost:50080";


    zu verwenden. Diese Richtung ist dem Fx im allgemeinenl bekannt, da localhost meist über die hosts-Datei zu 127.0.0.1 aufgelöst wird. Somit sollten die übrigen Alternativen entfallen.

  • Nachtrag:

    Das Programm funktioniert auch unter FF3 genau wie unter FF2.

    Mein Problem lag woanders: Das Zielgerät war ein XP embedded. Dort funktioniert der AJAX Aufruf

    Code
    var url = "http://localhost:50080/GetInfo.xml";


    aus irgendwelchen Gründen nicht. resObject.readyState bleibt auf "1" stehen, die Anfrage kommt auch beim Server an, aber der Rückweg funktioniert nicht, also geht readyState nie auf "4".

    Nach Änderung auf

    Code
    var url = "http://127.0.0.1:50080/GetInfo.xml";

    funktioniert es auch unter FF3 auf embedded XP.

    Ciao
    Frank[/u]