Hallo
Hier mein Code zum absichern eines Besuchertauschers gegen Framebrecher und gegen hängenbleiben. (Test auf Hängenbleiben nur in Version 1)

Bitte beachten: Ich habe es lokal getestet, habe aber keine Seite wo ich es online testen kann.
Weitere Infos unten.

Das Script:

1. Version mit Popup.

1. StartBT.htm (Diese Seite im Browser laden)
Öffne diese Datei im Brower um das Script zu starten. In einem echten BT müsste der Code auf der Seite eingebaut werden, von der aus man BT aufruft.
Will man den direkten Aufruf des BT erlauben (z.B. aus den Lesezeichen), so muss man eine Startseite machen, die per JavaScript den BT nach Aufruf startet. (Punkt 6)

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Besuchertausch starten</title>

<script type="text/javascript">

function StartBT () {
window.open("Kontroll_Popup.htm", "Framebrecher Meldung", "width=10, height=10");
}

</script>

</head>
<body;>

</body>
Besuchertausch <a href="" 
onClick="StartBT();">Starten</a>
</html>
2. Frameset.htm
Das Frameset. In einem echten Besuchertauscher wäre das das Dokument welches sich hinter der SurfURL verbirgt.
Es lädt einen oberen Frame (Vergütungsframe) und einen unteren (Werbung).

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<html>

<head>
<title>Frameset</title>

<frameset rows="300,*">
  <frame src="Vergütung.htm" name="ab"> 
  <frame src="ad.htm" name="werbung">
</frameset>

</head>

<body>
...
</body>

</html>
3. Vergütung.htm
Der Vergütungsframe. Hier einfach nur ein Dokument ohne jede Funktion.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Vergütungsframe</title>
</head>

<body>
Ich bin der Vergütungsframe
</body>
</html>
4. Ad.htm
Der Framebrecher. Er wird im unteren Frame des Frameset geladen.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Framebrecher</title>
<script type="text/javascript">
if (top != self) {
    top.location = self.location;
}
</script>
</head>
<body bgcolor="#000000" text="#FFFFFF">

<h1>Framebrecher</h1>

</body>
</html>
5. Kontroll_Popup.htm
Dieses Popup enthält den Framebrecher test und den Test ob der BT gestoppt hat. Verweilt der BT länger als 200 Sekunden auf der selben WerbeKampange, so lädt er erneut.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Kontroll Popup</title>



<script type="text/javascript">
//Variablen
//Austauschen gegen SurfURL des Besuchertauschers
var FramesetURL="Frameset.htm";
//----------------------------------------------------
var Counter;
var wegcount;
var win;
var Restartcount=0;
var StopCount;
var MaxCount=200;
var Wo1=0;
var Wo2;
var X;
var Y;
var Z;

//Start des Scriptes
function start() {
//URL bestimmen
X = self.location.href;
// von self.location.href den eigenen Dateinamen abschneiden
// weil "Kontroll_Popup.htm" 18 Zeichen hat hier: -18
Z = X.length - 18;
Y = X.substring(0, Z) + FramesetURL;
//Start
win = window.open(FramesetURL, "Besuchertausch", "width=800,height=600, status=1");   
Counter=setInterval("Wachen()", 1000);   
wegcount=setInterval("Restart()", 1000);
}

//Restart bei Popup close
function Restart() {
Restartcount++;
if (Restartcount > 5) {
win = window.open(FramesetURL, "Besuchertausch", "width=800,height=600, status=1");    
}   
}

//Überwachung
function Wachen() {
//Framebrechertest
if (win.location != Y) { 
win = window.open(FramesetURL, "Besuchertausch", "width=800,height=600, status=1");
StopCount=0;
}
Restartcount=0;
//Stopper Test
Wo2=win.frames[1].location;
if (Wo1==Wo2) {
StopCount++;
}
else {
Wo1=Wo2;
StopCount=0;
}
if (StopCount>MaxCount) {
win = window.open(FramesetURL, "Besuchertausch", "width=800,height=600, status=1");
StopCount=0;
}

}

function stop() {
win.close();
self.close();
}

</script>

</head>
<body onload= start();>

Wächter  

<a href="" 
onClick="{stop(); return false;}">Beenden</a>

</body>

</html>
6. AutoStartBT.htm (Diese Datei im Browser laden oder StartBT.htm)
Startet bei Aufruf automatisch den Besuchertausch.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Besuchertausch automatsich starten</title>

<script type="text/javascript">

function StartBT() {
window.open("Kontroll_Popup.htm", "Framebrecher Meldung", "width=10, height=10");
}

</script>

</head>

<body onload="StartBT()";>

</body>

</html>
Infos:
JavaScript muss aktiviert sein.
Das Kontroll_Popup muss geöffnet bleiben. Wird es beendet läuft der Besuchertausch zwar weiter, aber die Überwachung wird beendet.

Das Script enthält einen einfachen Wiederaufruf des BT nach Erkennung eines Framebrechers oder Countdownstoppers, könnte aber natürlich nach Erkennung eines Framebrechers, oder Countdown Stoppers auch eine Meldeseite aufrufen. Diese Meldeseite müste dann nach Annahme der Meldung selber zum BT zurückleiten.

Countdownstopper werden erkannt, indem überprüft wird ob sich die angezeigte Kampange geändert hat. Ändert sich die angezeigte Kampange für X Sekunden (hier 200 Sekunden) lang nicht, so wird das als Countdown Stopp gewertet. (Diese Funktion habe nicht getestet).

Wenn das Besuchertausch Popup geschlossen wird, so startet das Kontroll_Popup nach ca. 5 Sekunden den Besuchertausch in einem neuen Popup.

2. Version ohne Popup
Scheint nur mit FF 1.5 zu funktionieren.


1. Frameset.htm (Diese Datei im Browser laden)
Das Frameset.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<html>

<head>
<title>Frameset Test</title>

<script type="text/javascript">

function FBMeldung() {
       top.location="melden.htm";
        }  
     
</script>

<frameset rows="30,*"; onunload="FBMeldung()">
  <frame src="abuse.htm" name="ab"> 
  <frame src="ad.htm" name="werbung">
</frameset>

</head>

<body>

</body>

</html>
2. Ad.htm
Der Framebrecher
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Framebrecher</title>
<script type="text/javascript">
if (top != self) {
    top.location = self.location;
}
</script>
</head>
<body bgcolor="#000000" text="#FFFFFF">

<h1>Framebrecher</h1>

</body>

</html>
3. Abuse.htm
Der Vergütungsframe. Hier eine html Datei ohne funktion.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Vergütungsframe</title>

</head>
<body>

</body>

</html>
4. Melden.htm
Die Seite wird bei Framebrecher Erkennung aufgerufen und schickt den Browser nach 5 Sekunden zurück zum Frameset.
Da das Frameset auch nach einem vom User ausgelösten Reload diese Meldeseite aufruft, könnte an hier vielleicht auch einen Button oder Link einbauen, der die Meldung bei Klick rückgängig macht.
So würde die Kampange nicht zwangsläufig gemeldet werden nur weil ein User mal ausversehen die Seite reloadet.

Code:
<html><head><title>Test</title>

<script type="text/javascript">

function Go() {
self.location="Frameset.htm";
}

setTimeout("Go()", 5000);

</script>

</head>

<body bgcolor="#BACBDE">
Meldung. Weiter in 5 Sekunden
</body>

</html>
Diese Art der Framebrecher Erkennung werden einige vielleicht aus einigen Besuchertauschern kennen. Eben weil ich sowas schon mal gesehn hatte wusste ich, dass es irgendie geht oder zumindest mal ging.
Leider scheint sie (zumindest auf meinem System) nur im FF 1.5 zu funktionieren.

3. Version mit Restart Popup.

1. Frameset.htm (Diese Datei im Browser laden)
Das Frameset. Hier ist auch die Erkennung eingebaut.

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<html>

<head>
<title>Frameset Test</title>

<script type="text/javascript">
var win;

function FBMeldung() {
       win = window.open("Popup.htm", "Besuchertausch", "width=800,height=600, status=1");
}   
     
</script>

<frameset rows="30,*"; onunload="FBMeldung()";>
  <frame src="abuse.htm" name="ab"> 
  <frame src="http://www.gmx.de" name="werbung">
</frameset>

</head>

<body>

</body>

</html>
2. Abuse.htm
Der Vergütungsframe. Hier ein Dokument ohne Funktion

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Vergütungsframe</title>

</head>
<body>

</body>

</html>
3. Ad.htm
Der Framebrecher

Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Framebrecher</title>
<script type="text/javascript">
if (top != self) {
    top.location = self.location;
}
</script>
</head>
<body bgcolor="#000000" text="#FFFFFF">

<h1>Framebrecher</h1>

</body>
</html>
4. Melden.htm
Die Meldeseite. Sie wird bei einem Framebrecherfund im selben Fentser aufgerufen, in dem der Besuchertausch läuft und schickt das Gebrochene Fenster nach 5 Sekunden in den BT zurück. Die Seite kann aber auch im Popup geladen werden.

Code:
<html><head><title>Test</title>

<script type="text/javascript">

function Go() {
top.location.href="Frameset.htm";
//Wenn Die Seite im Popup geladen wird dann
//top.location.href=... ändern in
//opener.location.href=...
}

setTimeout("Go()", 5000);

</script>
</head>

<body bgcolor="#BACBDE">
Meldung. Weiter in 5 Sekunden

</body>
</html>
5. Popup.htm
Das Popup. Es entscheidet bei einer Framebrecher ähnliche aktivität, ob es wirklich ein Framebrecher war, oder ob der User den Besuchertauscher geschlossen hat.
Erkennt es einen Framebrecher, so schliesst es sich und lädt im gebrochenen Fenster die Meldeseite.

Code:
<html><head><title>Popup</title>

<script type="text/javascript">

function Close() {
//Schliesst das Popup
var x;
x=opener;
if (x) {
//Framebrecher muss gemeldest werden
opener.location.href="Melden.htm";
self.close();
}
else {
//User hat den Besuchertausch geschlossen
self.close();
}
}

</script>
</head>

<body bgcolor="#BACBDE" onload="Close()";>

</body>
</html>
Das Frameset öffnet bei einem Framebrecherfund, bzw wenn es verlassen wird das Popup. Das Popup prüft ob es wirklich ein Framebrecher war oder ob der User den Besuchertausch nur geschlossen hat. Es beendet sich aber dann sofort nach dem laden.
Erkennt es einen Framebrecher, so lädt es im Fenster welches gebrochen wurde die Meldeseite, welche nach 5 Sekunden in den Besuchertausch zurückleitet.