JavaScript iframe - Same-Domain-Policy bei Verwendung von PostMessage

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.568
Hallo Community!

Zuerst: Ich beschäftige mich seit gestern das erste Mal mit html, javascript und Ajax.

Ich versuche mich derzeit an einer Webseite (hier mal genannt "Masterseite") für einen Bekannten, die eine IFrame, welche auf eine Sportwetten-Seite (-> "Zielseite") zeigt, enthält. Diese Masterseite soll auf Druck eines Buttons die Zielseite in der iFrame aufrufen und in zwei Account-Textboxen einen Account eintragen, der auf der Masterseite hinterlegt ist.

Hier meine bisherigen Versuche:

HTML:
<!DOCTYPE html>
<html>
<head>
    <title>Schau mer mal</title>
    <style type="text/css">
        html, body
        {
            height: 99%;
        }
        #five
        {
            height: 5%;
        }
        #fiftynine
        {
            height: 95%;
        }
    </style>
    <script language="javascript">

        window.addEventListener("message", receiveMessage, false);

        function receiveMessage(event) {
            var iframe = document.getElementById('iframe');
            iframe.src = event.data;
        }

        function Reset() {
            var iframe = document.getElementById('iframe');
            iframe.src = '';
        }
        function GoToWebsite() {
            window.parent.postMessage('http://sportwettenseite/login', '*');
            var iframe = document.getElementById('iframe');
            var contentDocument = iframe.contentDocument;
            alert("Status contentDoc: " + contentDocument + " | Page: " + contentDocument.src);
            var passbox = contentDocument.getElementById('password');
            // Account-Daten eintragen...
        }
    </script>
</head>
<body>
    <div id="five">
        <input type="button" value="Reset" onclick="Reset();">
        <input type="button" value="GoToWebsite1" onclick="GoToWebsite1();">
    </div>
    <div id="fiftynine">
        <iframe frameborder="0" height="100%" id="iframe" src="" width="100%">Alternativtext</iframe>
    </div>
</body>
</html>

Aufgrunddessen, dass die Zielwebsite nicht in der gleichen Domain wie die Masterseite liegt, stoße ich unweigerlich auf das Same-Domain-Policy-Problem, bei dem das contentDocument meiner iFrame nach dem Laden null ist.

Deswegen hab ich nach der Anleitung auf stackoverflow (http://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy) mal die Variante mit PostMessage eingebaut, um an das contentDocument zu kommen.

Nur leider will das ganze so nicht funktionieren, contentDocument ist manchmal null (nachdem ich einen Reset-Button eingebaut habe und den vor dem erneuten Zielseiten-Aufruf diesen drücke, war es nicht mehr so oft null). Falls contentDocument mal nicht null ist, ist iFrame.src "Undifined" oder "About:blank" und ich komm auch nicht an die Elemente der Zielseite ran.

Wer kann mir helfen? Ich bin für jede Hilfe dankbar.

Gruß Thax
 
Danke für die schnelle Rückmeldung.
Die beiden Ziel-Webseiten sind http://www.txodds.com/login und http://www.oddsmonkey.com/OddsMonkeyLogin/tabid/76/Default.aspx?returnurl=/Default.aspx.

Vielleicht denke ich mit der iFrame auch zu kompliziert. Die Anforderungen des Bekannten sind folgende:

- Er und seine Kollegen wollen sich mit ein und dem selben Account auf die Webseite einloggen, dabei aber nur eine IP verwenden.
- Seine Kollegen sollen das PW das Accounts nicht kennen, deswegen das Webseiten-seitige eintragen der Accountdaten in die Textboxen der Zielwebseite

Grund für die Verwednung einer IP ist, dass es die Webseiten-Betreiber so möchten. Dies mit einem zwischengeschalteten Server und dessen IP durchzuführen, wäre rechtlich aber in Ordnung (hat er überprüfen lassen). Vielleicht brauche ich gar keine iFrame dazu? Ein einfacher Proxy müsste aber noch das Eintragen des Master-Logins in die Accountboxen der Ziel-Seite können.

Steh ich aufm Schlauch oder gehts echt nicht?
 
Zuletzt bearbeitet:
Bei dieser Konstellation kommst du um einen Proxy gar nicht herum, du musst definitiv einen nehmen.

Die Lösung wäre jetzt einen "intelligenten" Proxy auf dem Webserver laufen zu lassen, der via get_file_contents o.Ä. alle Daten auch gleichzeitig verarbeitet. Nur so kannst du die Logindaten effektiv auch vor den Kollegen verstecken.

Die Idee:

1. URL wird aufgerufen (im Parameter URL steht die "echte" URL)
2. Überprüfen, ob bereits eingeloggt
2.1 sonst einloggen und Logindaten (Session-Cookie etc. speichern)
3. Die Daten der Webseite holen (get_file_Contents oder via cURL, weil du mglw. ja Cookies mitsenden musst)
4. Wenn HTML,CSS oder JS
4.1 nach URLs suchen und entsprechend umschreiben
5. Ergebnis zurücksenden

Achte darauf, dass du auch Bilder und so entsprechend verarbeiten können musst. Für URL (also Punkt 4.1) kann dir mod_rewrite vielleicht etwas Arbeit abnehmen (relative URLs und so).
 
Uhh, das klingt ja kompliziert. Das dürfte meine ein-Tage-alten Fähigkeiten bei weitem überschreiten. Danke erstmal, aber ich werd ihn nochmal fragen, ob er auf das "Verstecken" des Logins verzichten kann. Dann würde es imo ein stinknormaler Proxy auch tun.
 
Zurück
Oben