PHP - include per GET-Parameter

Benutzer-621

abgemeldet
20 April 2006
744
64
Moin,
möchte Dateien, über include einbinden mitm GET-Parameter, klappt aber leider net, da ohne Angabe von Parameter site .php includiert wird. Es muss, denk ich irgendwie an isset/empty liegen??? Hoffe mir kann geholfen werden :D. Danke

PHP:
  $incval = (!isset($_GET['site']) || empty($_GET['site'])) ? "index.php" : file_exists($_GET['site'].".php") ? $_GET['site'].".php" : "index.php" ;

  include($incval);

so funzt es, haben Klammern gefehlt, PHP kann manchmal so "schwer" sein :D.

PHP:
  $incval = (!isset($_GET['site']) || empty($_GET['site'])) ? "index.php" : (file_exists($_GET['site'].".php") ? $_GET['site'].".php" : "index.php") ;

  include($incval);

MfG
 
Zuletzt bearbeitet:
bevor man anfängt das include-Problem zu lösen, sollte man vielleicht das Ganze nochmal bisschen überdenken ^^
 
So mach ich das immer^^

PHP:
$_PAGE=$_GET['p'];

if($_PAGE=="")
{
	$_PAGE="main";
}

if(file_exists("$_PAGE.php"))
{

	include("$_PAGE.php");

}
else
{
	header("HTTP/1.0 404 Not Found");
}

MfG,
Eugen
 
eugenb schrieb:
So mach ich das immer^^

PHP:
$_PAGE=$_GET['p'];

if($_PAGE=="")
{
	$_PAGE="main";
}

if(file_exists("$_PAGE.php"))
{

	include("$_PAGE.php");

}
else
{
	header("HTTP/1.0 404 Not Found");
}

MfG,
Eugen
wenn ich du wäre würde ich alle Seiten die so einen Code haben schleunigst offline nehmen. Da kann man sich ja schön austoben.
p=https://example.com/boeser-code

MfG respawner
 
respawner schrieb:
wenn ich du wäre würde ich alle Seiten die so einen Code haben schleunigst offline nehmen. Da kann man sich ja schön austoben.
p=https://example.com/boeser-code

MfG respawner

Das verhindert er durch die Überprüfung mit file_exists. Ich seh da kein Problem.

EDIT: Allerdings würde ich bei dem Code mal die Strings von den Variablen trennen. ;)
 
tobias1985 schrieb:
Das verhindert er durch die Überprüfung mit file_exists. Ich seh da kein Problem.

EDIT: Allerdings würde ich bei dem Code mal die Strings von den Variablen trennen. ;)
OK hast recht, aber man sollte darauf achten, dass man nicht mit ../ auf Verzeichnisse zugreifen kann, auf die der User keinen Zugriff haben soll.

MfG respawner
 
tobias1985 schrieb:
Das verhindert er durch die Überprüfung mit file_exists. Ich seh da kein Problem.
Naja, PHP5 vorausgesetzt könnte es da mit p=ftp://somevilsite einige Probleme geben. Da wird file_exists() nämlich laut Doku auch auf dem FTP-Wrapper unterstützt und ich geh einfach mal stark davon aus, dass man, wenn man von HTTP includen kann, auch von FTP includen kann.

@tester:

Selbst schuld, wenn man 'nen zweistufigen ternären Operator aufbaut... ;)
 
tleilax schrieb:
Naja, PHP5 vorausgesetzt könnte es da mit p=ftp://somevilsite einige Probleme geben. Da wird file_exists() nämlich laut Doku auch auf dem FTP-Wrapper unterstützt und ich geh einfach mal stark davon aus, dass man, wenn man von HTTP includen kann, auch von FTP includen kann.

@tester:

Selbst schuld, wenn man 'nen zweistufigen ternären Operator aufbaut... ;)

gefällt mir eben besser als ELSE/IF :D.
 
tleilax schrieb:
Naja, PHP5 vorausgesetzt könnte es da mit p=ftp://somevilsite einige Probleme geben. Da wird file_exists() nämlich laut Doku auch auf dem FTP-Wrapper unterstützt und ich geh einfach mal stark davon aus, dass man, wenn man von HTTP includen kann, auch von FTP includen kann.

Mit PHP5 hab ich bisher keine Erfahrung. Ändert sich noch, sobald ich den Server wechsle. Dann schau ich mal ob der obige Code immernoch sicher wäre.
Mit PHP4 und obigem Code gibts auf jeden Fall keine Probleme.

@eugenb: Änder mal deinen Programmierstil so, dass du Strings von Variablen trennst. (schneller, da PHP die Strings nicht mehr erst nach Variablen durchsuchen muss) Dein Code würde dann so aussehen:

PHP:
$_PAGE=$_GET['p']; 

if($_PAGE=="") 
{ 
    $_PAGE="main"; 
} 

if(file_exists($_PAGE.".php")) 
{ 

    include($_PAGE.".php"); 

} 
else 
{ 
    header("HTTP/1.0 404 Not Found"); 
}

Ich persönlich arbeite dann noch mit single quotes. Also die Strings statt in "-Zeichen in '-Zeichen ändern.
" -> double quotes
' -> single quotes

Manche behaupten single quotes wären schneller. Ich hab einige Benchmarks im Internet dazu gesehen. Diese Behauptung kann man nicht verallgemeinern. In manchen Fällen sind double quotes schneller und in anderen Fällen single quotes. Ich sehs als persönliche Entscheidung und ich hab mich mittlerweile auf single quotes gewöhnt.
 
@eugenb: Änder mal deinen Programmierstil so, dass du Strings von Variablen trennst. (schneller, da PHP die Strings nicht mehr erst nach Variablen durchsuchen muss)
wieso soll das schneller sein ? PHP weiß ja nicht, dass der Text keine variablen enthält und parst ihn trotzdem.


PS: ich weiß, Totengräber... :ugly:
 
Naja

Das Includeproblem ist eigentlich nicht lösbar.
file_exists() konnte bei mir auf einem Server scheints auch schon mal umgangen werden.
In jedem Fall sollte man das .php nachträglich einfügen.
Am besten ist es tatsächlich man hat dann eben z.B. ein Array, in dem alle Seiten stehen, sie aufgerufen werden dürfen.
Taja, vms ist halt so gebaut... No Risk no Fun. Aber ich würde selber so eine Seite nicht mehr bauen.
 
Das Includeproblem ist eigentlich nicht lösbar
Ja wie? :hö:
Natürlich ist das include()-Problem jederzeit lösbar; eine Whitelist anlegen, und schon wird man wieder ruhig schlafen können.
Sofern es einen vorher interessiert hat; bezweifle ich leider bei so manchem Seitenbetreiber hier immer wieder :-? :( .
 
jo

Hab ja gesagt am besten ist z.B. ein Array in dem alle erlaubten Seiten stehen (Whitelist). Das ist aber wohl fast zu arbeitsintensiv, drumm meinte ich auch es ist am besten Seiten einfach direkt aufzurufen.

Mit dem include sollte der Seitenaufbau ja erleichtert und nicht komnpliziert werden...

p.s.: Vielleicht wäre das ja eine interessante Möglichkeit um Lose zu verdienen. Whitelists für das vms und andere CMS die so arbeiten erstellen :)
 
Mit dem include sollte der Seitenaufbau ja erleichtert und nicht komnpliziert werden...

Naja, so viel mehr Arbeits ists nun nicht. Halt nur etwas mehr schreibkram ;)

Wie wäre es denn wenn man festlegt, dass nur wenn die Dateien in einem bestimmten Ordner auf dem Server liegen ausgeführt werden?

So in der Art:
PHP:
$allowedDir = $_SERVER['DOCUMENT_ROOT'].'/includes/';

if( isset($_GET['file']) && !empty($_GET['file']) ){

   if(file_exists($allowedDir.$_GET['file'].'.php')){

       include $_GET['file'].'.php';

   }
   else{
       header(...);
   }

}
else{
   ....
}

Is mir grad nur so in den Sinn gekommen :ugly:

Mfg Raze
 
Eigentlich müsste es sich doch bessern, wenn man zusätzlich einen regulären Ausdruck verwendet, der alle Zeichen, bis auf Buchstaben und Zahlen rausschmeißt.