Slavomir: Frameset prüfen

Hallo!

Ich habe hier ein kleines Problem beim prüfen, ob meine Frames auch "ordnungsgemäß" im richtigen Frameset erscheinen.

Es gibt also ein Frameset (frameset.html), welches zwei Frames (left.html, right.html) beinhaltet ..

Wie stelle ich innerhalb der Frames sicher, dass sie AUSSCHLIESSLICH in ihrem Frameset (frameset.html) geladen werden?

Es darf also nicht passieren, dass ein "feindliches Frameset" meine Frames (left.html, right.html) oder mein Frameset (frameset.html) umschliesst..

Ich freu mich schon auf eure Ideen, bin etwas am schwimmen, weil meine Ansätze nicht so gut funktionieren. Beispielsweise schaffe ich es nicht zunächst einen window.onError Handler zu installieren, damit ich eine Art Exception Handling beim Zugriff auf top.location zu Stande kriege..

Wie gesagt, ich würde mich freuen..

Slavomir

  1. Hallo!

    Es darf also nicht passieren, dass ein "feindliches Frameset" meine Frames (left.html, right.html) oder mein Frameset (frameset.html) umschliesst..

    Sieh Dir bitte mal http://aktuell.de.selfhtml.org/tippstricks/javascript/fensterzugriff/index.htm und http://de.selfhtml.org/javascript/beispiele/seitenanzeige.htm

    Ich freu mich schon auf eure Ideen, bin etwas am schwimmen, weil meine Ansätze nicht so gut funktionieren. Beispielsweise schaffe ich es nicht zunächst einen window.onError Handler zu installieren, damit ich eine Art Exception Handling beim Zugriff auf top.location zu Stande kriege..

    Das läßt sich sicher auch grade biegen, nur solltest Du auch Deinen Ansatz verlinken / posten ;)

    Gruß aus Berlin!
    eddi

    1. Hallo,

      die Seiten kenne ich, konnte mir allerdings nicht helfen. Ich werde mein Problem genauer schildern.

      Meine Seite sieht zb so aus:

      www.uga-agga.de/quatsch/frameset.html
        www.uga-agga.de/quatsch/left.html
        www.uga-agga.de/quatsch/right.html

      In meinem right.html möchte ich nun überprüfen, dass es in einem Frameset geladen wird und dass das frameset vom selben Server stammt, also als location www.uga-agga.de/quatsch/frameset.html hat.

      Das habe ich mal so versucht:

      myRegExp = new RegExp("^(.*)/right.html$");
      myArray  = myRegExp.exec(self.location);
      myURL    = myArray[1];

      Nun besorg ich mir die location meines parent:

      pURL    = parent.location;
      pRegExp = new RegExp("^(.*)/[^/]*$");
      pArray  = pRegExp.exec(pURL);

      if (pURL != myURL)
        alert("böse, böse");

      Bereits beim ausführen der RegExp (pArray  = pRegExp.exec(pURL);) erhalte ich bei der Simulation eines bösen Frames von einem anderen Server:

      Inline script thread
      Error:
      name: Error
      message: Security violation

      Da genügt es auch nicht, vorher ein

      self.onError = null;

      abzugeben, da der davon nicht gecatched wird...

      Ist wohl nicht ganz so easy..
      S.

      -------------------------------
      Hier noch mal das ganze Script:

      right.html:

      <SCRIPT>
      self.onError = null;

      myRegExp = new RegExp("^(.*)/right.html$");
      myArray  = myRegExp.exec(self.location);
      myURL    = myArray[1];

      pURL    = parent.location;
      pRegExp = new RegExp("^(.*)/[^/]*$");
      pArray  = pRegExp.exec(pURL);

      if (pURL != myURL)
        alert("böse, böse");

      </SCRIPT>

      1. Da hat sich ein kleiner Fehlerteufel eingeschlichen:

        Muss natürlich

        if (pArray[1] != myURL)
          alert("böse, böse");

        heissen.. ist aber in diesem Zusammenhang auch egal..

      2. Hallo,

        die Seiten kenne ich, konnte mir allerdings nicht helfen. Ich werde mein Problem genauer schildern.

        Meine Seite sieht zb so aus:

        www.uga-agga.de/quatsch/frameset.html
          www.uga-agga.de/quatsch/left.html
          www.uga-agga.de/quatsch/right.html

        In meinem right.html möchte ich nun überprüfen, dass es in einem Frameset geladen wird

        if(parent)

        und dass das frameset vom selben Server stammt, also als location www.uga-agga.de/quatsch/frameset.html hat.

        if(parent && parent.location.href.indexOf(servername)!=-1)

        RegEx ...

        Warum in die Ferne schweifen? Sieh, das Gute liegt so nah,
        lerne nur das Glück ergreifen, denn das Glück ist immer da.

        ;)

        Gruß aus Berlin!
        eddi

  2. Hi,

    Es darf also nicht passieren, dass ein "feindliches Frameset"

    :-))

    Beispielsweise schaffe ich es nicht zunächst einen window.onError Handler zu installieren, damit ich eine Art Exception Handling beim Zugriff auf top.location zu Stande kriege..

    Die Idee ist aber brauchbar und bei meiner Lösung nutze ich sie: http://www.1ngo.de/web/framesets.html.

    freundliche Grüße
    Ingo

    1. Ahhh, ich verstehe.

      Das Problem liegt wohl darin, dass der Opera

      Inline script thread
      Error:
      name: Error
      message: Security violation:

      nicht korrekt an den richtigen Error-Handler weiterleitet..

      Im Firefox geht es nämlich ohne Probleme..

      1. Hi,

        Das Problem liegt wohl darin, dass der Opera

        Inline script thread
        Error:
        name: Error
        message: Security violation:

        nicht korrekt an den richtigen Error-Handler weiterleitet..

        das scheint zuzutreffen, allerdings sollte die Methode trotzdem die gewünschte Wirkung haben, nämlich den Autor des "feindlichen" ;-) Framesets davon abhalten, die Seite so einzubinden, wenn das doch bei der Mehrheit der Besucher nicht funktioniert.

        freundliche Grüße
        Ingo

  3. Folgendes kleines Codeschnipselchen sollte auch beim Opera helfen:

    try {
      parent.location.host;
    } catch (e) {
      alert("Hier kann ich jetzt einen redirect anbringen..");
    }

    Stellt sich jetzt nur noch die Frage, welcher Browser das try-catch unterstützt...

    1. Hallo,

      offen gestanden verstehe ich nicht, warum Du versuchst, alles unnötig kompliziert zu gestalten. Entweder das Dokument hat einen übergeordnetens Objekt parent oder nicht. Hat es dieses (und das ist unabhängig davon feststellbar, ob das Dokument diese window komplett geladen ist) dann parent.location.host verfügbar. Was willst Du nun mit try - cacht?

      Gruß aus Berlin!
      eddi

      1. Das ist schnell zu erklären. Sollte es tatsächlich ein parent geben, das nicht von meinem Server kommt (also ein "feindliches" parent), DARF ich nicht auf die location zugreifen. Das verbietet mir (verständlicherweise) das Javascript.

        Wenn man diesen Zugriff nämlich tätigt, gibt es ja zwei Möglichkeiten:

        a.) ich darf darauf zugreifen => das parent ist von meinem Server
        b.) ich darf nicht zugreifen => das parent ist NICHT von meinem Server

        Leider erzeugt b.) aber einen Fehler. Also registriert man einfach einen Error-Handler, der diesen Fehler dann empfängt, so dass man dann weiter arbeiten kann. Wenn man nämlich diesen Fehler nicht abfängt, wird jegliche Bearbeitung des Javascripts abgebrochen, so dass ich dann also zwar ermitteln kann, dass b.) zutrifft, aber keine weiteren Massnahmen treffen kann.

        Leider gestattet mir mein Opera nicht, diesen Fehler über onError abzufangen, so dass ich mit try catch anrücken muss.
        In einem Crossbrowser-kompatiblen Skript muss mal also sowohl die onError also auch die try-catch Schiene fahren..