Referer von durch javaskript automatische geöffneten fenstern

srpcool

Grünschnabel
Hi,

hab da ein kleines Problemchen: ich öffne mit Javascript (window.open) ein Fenster automatisch. Dieses soll testen, dass es auch nur so aufgerufen wurde. Ich wollte es zunächst mit $_SERVER['HTTP_REFERER'] machen, aber der Referer ist immer leer.

Das Skript an sich funktioniert, wenn ich über einen Link gehe.

Hier noch der Quelltext
PHP:
$ref=$_SERVER['HTTP_REFERER'];
$ref = strtolower($ref);		
echo"Referer: $ref <br>";
if($ref=="http://127.0.0.1/...." || $ref=="http://localhost/....")  {
echo"GLEICH";
}
else  {
echo"VERSCHIEDEN";
}

ciao
 
Wenn der Referer leer ist benutz eben Sessions und schreib da die location und den referer rein. wenn location und referer OK sind gibste dein Content aus...
 
Du könntest beim open() an die URL der Seite die location der Ursprungsseite als Parameter ranhängen Und statt referer diesen Parameter abfragen.
Code:
window.open('page.php?referer='+document.location)
 
das kann jeder nach belieben immitieren, so sind unbemerkte aufrufe von falscher stelle immer noch möglich

dennoch danke für deine idee
 
Oder Du trixt n bissi

PHP:
$myreferer = md5($_SERVER[HTTP_REFERER].date("mdyH"));
das gibste dann weiter und checkst das gegen. der Referer kann ja fest sein also hardcoded im Script stehen und da hängste dann Monat, Tag, Jahr und stunde drann das sollte gehen. Minuten und sekunden wurde ich nicht verwenden.

Pech hat natürlich der der ne Sekunde vor dem Stundenwechsel also um :59:59 auf den Link klickt aber das is denke ich egal... kannste ja abfangen und n sleep() reinsetzen...
 
Hallo!

Nicht nur die Rechtschreibung ist bei u-Danilo schlecht, sondern auch die Idee!
Ich würd' es so machen, wie es Fatalus bereits vorgeschlagen hat.
Um das Ganze sicherer zu machen, kannst du den Parameter mit md5() verschlüsseln, sodass den keiner ändern kann.
Das solltest du aber natürlich nicht mit einem statischen Wert machen, da die Verschlüsselung ja sonst nichts nützt.

Hier mal ein Beispiel:

Hauptfenster:
PHP:
<?php
session_start();
$_SESSION['linkid'] = md5(microtime());
echo "<a href=\"javascript:openwindow('link.php?linkid=$_SESSION[linkid]&".session_name()."=".session_id."\">link</a>";
?>

Das geöffnete Fenster:
PHP:
session_start();

if ($_GET['linkid'] != $_SESSION['linkid'])
die ('kein Zutritt!');

//weiterer Seiteninhalt

Das bewirkt, dass die Seite nur einmal und auch nur mit einer gültigen Session geöffnet werden kann.
Es könnte nun aber immernoch jemand den Quelltext deiner Seite begutachten und den Link einfach so aufrufen!
Um das zu verhindern, könnte man eine Seite "dazwischen schalten".
Damit meine ich, dass du in dem Fenster, dass geöffnet wird einfach eine Weiterleitungs-Seite aufrufst, die als ZUSÄTZLICHEN Parameter zum Beispiel

PHP:
dechex(time());

ubergibt.
Dechex mache ich, damit dass nicht sofort offensichtlich ist, dass das ein Timestamp ist.
Und in der nächsten Seite überprüfst du einfach, ob die Zeit die übergeben wurde zum einen mit der in der Session gespeicherten Zeit übereinstimmt (was du natürlich noch extra machen müsstest) und zum anderen, ob die aktuelle der Link zum Beispiel in den letzten 2 sekunden aufgerufen wurde.
Das ist zwar nicht 100%ig, aber wer kann schon einen Link in 2 Sekunden heraus finden und den auch gleich aufrufen?
Und ich würde deswegen eine extra Zwischenseite einbauen, da man ja nicht davon ausgehen kann, dass der Link (javascript:window.open()) sofort aufgerufen wird.
Wurde aber erst einmal auf den Link geklickt, lässt sich doch behaupten, dass die Weiterleitung innerhalb der gesetzten Zeit eintritt.

Beispiel:

Hauptfenster:
PHP:
<?php
session_start();
$_SESSION['linkid'] = md5(microtime());
echo "<a href=\"javascript:openwindow('weiterleitung.php?linkid=$_SESSION[linkid]&".session_name()."=".session_id."\">link</a>";
?>

Weiterleitung.php:

PHP:
session_start();
if ($_GET['linkid'] != $_SESSION['linkid'])
die ('kein Zutritt!');
$_SESSION['newlinkid'] = md5(microtime());
$_SESSION['linktime'] = dechex(time());
header ("Location: link.php?newlinkid=$_SESSION[newlinkid]");


Link.php
PHP:
session_start();

if (($_GET['linkid'] != $_SESSION['linkid']) || ($_GET['linktime'] != $_SESSION['linktime']) || (hexdec($_SESSION['linktime'] < (time()-2)))
die ('kein Zutritt!');

//weiterer Seiteninhalt
 
Zurück