[PHP] Referer überprüfen

Brom

Gummibärchen
13 Januar 2007
656
69
Hallo,

ich habe ein kleines Porblem, und zwar möchte ich bei einem Videaufruf prüfen ob der Referer richtig ist. Wenn der Referer richtig ist wird uf das Video weitergeleitet.
Die Video URL ist dann folgende :
Code:
player.php?code=hier_die_url_mit_base64_encode_verschlüsselt

Nun Habe ich dazu folgendes Script in der Player.php
PHP:
<?php
// Variablen setzen.
$url = trim($_GET['code']);
$url_decode = base64_decode($url);
$refcheck = false;
$ref = $_SERVER['HTTP_REFERER'];
$ref_parse = parse_url($ref);

// Url angegeben ?
if(!isset($url) or empty($url)) {
	die("Ein interner Fehler ist aufgetreten, die URL ist falsch !");
}

// Refrercheck
if (trim($ref_parse['host']) == 'test.domain-name.de') {
	$refcheck = 'ok';
}

// Ref ok ?
if($refcheck == 'ok'){
	// Intern auf Video weiterleiten.
	header("Location: ".$url_decode);
} 
else
{
	header("Location: falscher_referer.wmv");
}

// Jeder stirbt einmal.
die();
?>


Ich hab mir den Referer auch schon in einem Cookie speichern lassen, dort funktioniert alles. Aber mit diesem Script bekomme ich immer das falscher Referer Video ausgegbeen.

Weiß jmd. wo der Fehler liegt ?

Danke

Mfg
Brom
 
der Code scheint in Ordnung zu sein.

guck mal was genau im Wert drinnensteht:

PHP:
//...code...
if (trim($ref_parse['host']) == 'test.domain-name.de') {
    $refcheck = 'ok';
}
echo "
if('".trim($ref_parse['host'])."' == 'test.domain-name.de')";  //dieses if als Text ausgeben
exit;



denk übrigens daran dass das kein 100%ig sicherer Schutz ist, das kann man durchaus per referer-Fälschung austricksen
 
Hab ich gemacht,

Output:
Code:
if(test.domain-name.de == \"test.domain-name.de\")\";

Mhh also da liegt der fehler nicht oder ?

Mfg
Brom
 
Dann lass dir doch mal $refcheck ausgeben^^


außerdem würde ich eine kleigkeit ändern, vielleicht hast du einen vartype fehler(würde mich allerdings ein klein wenig wundern), und zwar

statt $refcheck = 'ok'
mach $refcheck = true;

und natürlich statt "if($refcheck == 'ok'){" ein "if($refcheck){"


EDIT: ich hab deinen Code getestet er arbeitet einwandfrei.

wie rufst du die seite denn auf? ist der referer da eh richtig drin? Schau mal auf rechtschreibfehler!


if (trim($ref_parse['host']) == '...') {
$refcheck = 'ok';
}else{

echo "dein referer: ".trim($ref_parse['host']).", richtig:...";
}
 
Zuletzt bearbeitet:
Code:
<div class="videoarea" id="showvideo"><embed width="270" height="240" autostart="0" allowscriptaccess="never" showstatusbar="1" showcontrols="1" type="application/x-mplayer2" src="secret_player.php?code=aHR0cDovL3JlbGF1bmNoLnNleC1wYXNzLmV1L3NleXJldGZpbGVzL2xvY2FsdmlkZW9zL0FtYXRldXJlL0Fkcmlhbm5hL21zMTY4XzMwMF8wMDIud212" id="MediaPlayer"/></div>

So wird das Video aufgerufen.

Mit true hab ich voher gemacht, da hats aber auch nicht funktioniert.
Ich versteh das echt nicht.

Aber danke schonmal für deine Hilfe.

Brom
 
PHP:
if (trim($ref_parse['host']) == 'test.domain-name.de') {
    $refcheck = 'ok';
}else{

die("dein referer: ".trim($ref_parse['host']).", richtig:test.domain-name.de");
}
probier mal aus das hineinzuschreiben und schau was passiert
 
Da gibt der mir gar nichts aus, weil er ja garnicht in den else teil geht ^^

Das jetzt mein aktuelles Script:

PHP:
<?php
/*
	Secret-Player
	==========
	...

$url = trim($_GET['code']);
$url_decode = base64_decode($url);
header("Location: ".$url_decode);
*/

// Variablen setzen.
$url = trim($_GET['code']);
$url_decode = base64_decode($url);
$refcheck = false;
$ref = $_SERVER['HTTP_REFERER'];
$ref_parse = parse_url($ref);

// Url angegeben ?
if(!isset($url) or empty($url)) {
	die("Ein interner Fehler ist aufgetreten, die URL ist falsch !");
}

// Refrercheck
if (trim($ref_parse['host']) == 'test.domain-name.de') {
	$refcheck = true;
}

// Ref ok ?
if($refcheck == true){
	// Intern auf Video weiterleiten.
	header("Location: ".$url_decode);
}
else
{
	header("Location: falscher_referer.wmv");
}

// Jeder stirbt einmal.
die();
?>
 
Zuletzt bearbeitet:
Jetzt reichts, muss ja mal was werden


Ich habe deinen Code überarbeitet und eine vernünftige Debugging funktion hinzugefügt(die kannst du wieder löschen wenn du willst, oder du lässt sie drinnen)

Wehe die Version funktioniert auch nicht^^


PHP:
<?php 

$debug_mode=true;  //set to false to deaktivate debugging 

/* 
    Secret-Player 
    ========== 

*/ 

// Variablen setzen. 
$url = trim($_GET['code']); 
$url_decode = base64_decode($url); 
$refcheck = false; 
$ref = $_SERVER['HTTP_REFERER']; 
$ref_parse = parse_url($ref); 

// Url angegeben ? 
if(!isset($url)) { 
    //die("Ein interner Fehler ist aufgetreten, die URL ist falsch !"); 
    debug("Keine URL angegeben!",true,true);  //wie du willst,deine erste Version ist auch ok (nur gewohnheit :) )
} 

// Referercheck - Setze Variablen
  $referercheck=trim($ref_parse['host']) ;
  $mydomain=$_SERVER['SERVER_NAME'];
  
// Referercheck - Überprüfung
if ($referercheck == $mydomain) { 
    $refcheck = true; 
}else{
 debug("Referer: ".$referercheck.", Right one: ".$mydomain,true,true); //gib eine Fehlermeldung aus. Wenn im Debugging modus, dann genaue angabe, sonst Stop mit Internal Error

}

// Ref ok ? 
if($refcheck == true){ 
    // Intern auf Video weiterleiten. 
    debug("Erfolgreich",true); //Stoppe wenn debugging mode eingeschalten
    header("Location: ".$url_decode); 
} 
else 
{   
    debug("Fehlgeschlagen",true); //Stoppe wenn debugging mode eingeschalten
    header("Location: falscher_referer.wmv"); 
} 

// Jeder stirbt einmal. 
die();




//dies ist eine meiner kleineren Debugging funktionen^^


function debug($text, $die=false, $die_if_debugging_off=false){
  
  //$text wird angezeigt wenn globalvar $debug_mode auf true ist.
  //$die sagt aus ob der script stoppt, wenn debug() aufgerufen wird.
  //$die_if_debugging_off sagt aus, ob der script stoppt, wenn debug() aufgerufen wird und debug_mode auf false ist.

 global $debug_mode;
 $debug_data=debug_backtrace();
 
   if($debug_mode){
     if($die){
      die("<br />Debugging(Line: ".$debug_data[0]['line']."): ".$text);
     }else{
      echo "<br />Debugging(Line: ".$debug_data[0]['line']."): ".$text."<br />";
     }
     return true;
   }else{
      if($die_if_debugging_off){
        die("<br /><b>Internal Error! ErrorID: ".$debug_data[0]['line'].", in File ".$debug_data[0]['file']."</b>");
      }
      return false;
   }
 
}

?>


PS: hihi jetzt weiss ich warum du das vorletze mal die Domain nicht hergezeigt hast :) xD
 
Ich bekomme zwar erfolgreich ausgegeben, aber es klappt tortdem nicht 8O
Hab dich mal in ICQ geadded. Hoffe war die richtige Nummer.

Brom
 
Ich lass mir die Ausgaben in einem Cookie speichern, und nacher ausgeben, weil ich es ja nicht direkt im Player ausgeben kann.

Gruß,
Brom
 
Nehm mal Firebug (Firefox addon) und schau dir mit "NET" an was da genau passiert.

Ok ich schau ma eben.


edit://
Request Headers
Host test.domain-name.de
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept [...]
Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Referer https://test.domain-name.de/index.php?option=com_seyret&Itemid=84&task=videodirectlink&id=7
Cookie [...]

Ist doch alles richtig oder ?
 
Zuletzt bearbeitet:
3 sachen

a) sowas testet man immer im Browser, wenn es im Browser geht dann auch bei Mediaplayer
b) Cookies können nicht immer 100% ig alles Speichern
c) Cookies werden bei header("Location ..."); NICHT gespeichert!


*denk trotzdem daran dass der Mediaplayer von Microsoft ist xD^^

Edit: d) wenn du schon die Ausgabe umleitest, dann mach das bitte mit ob_start() und ähnlichen, und leite sie mit fopen in eine Datei um^^
 
Zuletzt bearbeitet:
Ist doch alles richtig oder ?

Ja sieht richtig aus... respons header wären noch interessant gewessen, aber ok. Mach mal vor dem if ein var_dump($referercheck == $mydomain,$referercheck,$mydomain); rein. (die Ausgabe kannste mit firebug anschauen) Vielleicht siehst du damit das Problem.
 
Ja sieht richtig aus... respons header wären noch interessant gewessen, aber ok. Mach mal vor dem if ein var_dump($referercheck == $mydomain,$referercheck,$mydomain); rein. (die Ausgabe kannste mit firebug anschauen) Vielleicht siehst du damit das Problem.

bool(true)

string(20) "test.domain-name.de"

string(20) "test.domain-name.de"


Schaut auch richtig aus.

Argh ich verzweifel noch ^^


edit://

so hab jetzt folgendes Script und bei debuging on gibt er mir
<br />Debugging (Line: 34): Referer ok !
aus.

Bis dahin klappt alles. Aber ich werden trotzdem auf das referer falsch video weitergeleitet

PHP:
<?php
/* 
    Secret-Player

*/ 

// Variablen setzen. 
$debug_mode = true; // Debug an ?

$url = trim($_GET['code']); 
$url_decode = base64_decode($url); 
$refcheck = false; 
$ref = $_SERVER['HTTP_REFERER'];
$ref_parse = parse_url($ref); 

// Url angegeben ? 
if(!isset($url)) { 
    debug("Keine URL angegeben!", true, true);
} 

// Referercheck - Setze Variablen
$referercheck = trim($ref_parse['host']);
$mydomain = $_SERVER['SERVER_NAME'];

// Referercheck - Überprüfung
if ($referercheck == $mydomain) { 
	// Intern auf Video weiterleiten. 
    debug("Referer ok !", true);
   header("Location: ".$url_decode);
   die();
}
else
{
	debug("Referer falsch ! So´n scheiss !", true);
    header("Location: falscher_referer.wmv");
die();
}


/*
	Debugfunktion von Salkin.
	Salkin @ Klamm.de
	Danke.
	
	//$text wird angezeigt wenn globalvar $debug_mode auf true ist.
	//$die sagt aus ob der script stoppt, wenn debug() aufgerufen wird.
	//$die_if_debugging_off sagt aus, ob der script stoppt, wenn debug() aufgerufen wird und debug_mode auf false ist.
*/
function debug($text, $die=false, $die_if_debugging_off=false){
	global $debug_mode;
	$debug_data=debug_backtrace();
	if($debug_mode){
		if($die){
	  		die("<br />Debugging (Line: ".$debug_data[0]['line']."): ".$text);
		}
		else
		{
	  		echo "<br />Debugging (Line: ".$debug_data[0]['line']."): ".$text."<br />";
	 	}
	 	return true;
	}
	else
	{
		if($die_if_debugging_off){
			die("<br /><b>Internal Error! ErrorID: ".$debug_data[0]['line'].", in File ".$debug_data[0]['file']."</b>");
	  	}
	  	return false;
	}
}


exit;
?>
 
Zuletzt bearbeitet:
und warum wohl?

Ich nehme an:
weil du mit dem Player testest. Wer sagt denn dass der einen Referer überträgt? Anscheinend nämlich nicht. kA was zb der Mediaplayer überträgt, du könntest das mit Wireshark testen, wird aber nichts rauskommen außer das, dass er die URL ohne einem referer header öffnet(wozu auch)

Das Problem musst du anders lösen -->ICQ
 
der referer wird mir doch richtig ausgegeben udn nicht im cookie sondern im player über firebug getestet.

Naja ich ticker dich mal im icq an
 
c) Cookies werden bei header("Location ..."); NICHT gespeichert!
Hier muss ich doch widersprechen. Das folgende Skript müsste dann ja zu einer Endlosweiterleitung führen, aber in jedem mir zur Verfügung stehenden Browser wird wie gewünscht "bar" ausgegeben:
PHP:
<?php
	if (empty($_COOKIE['foo']))
	{
		setcookie('foo', 'bar');
		Header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
		die;
	}

	echo $_COOKIE['foo'];
?>
 
Ich nehme an: weil du mit dem Player testest. Wer sagt denn dass der einen Referer überträgt? Anscheinend nämlich nicht-

Das war auch meine erste vermutung, ist aber nicht so. Ich hatte es mit Firefox getestet und da wird ein Referer gesendet. (habs mit Firebug getestet)