[php] Switch und Include

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Hallo ich habe ein problem ;) ich habe mich mit meinem Switch und include bissel verstrickt und bin nun auf der suche nach einer Möglichkeit mein script noch ein bissel zu Optimieren und dynamischer zu machen. Ich würde z.b. wie unten bei action gerne noch die möglichkeit haben mit action noch andere dinge zu includen. Kann mir da wer bissel helfen?

DANKE

PHP:
<?php
if(isset($myid) AND is_numeric($myid)) 
{
	if(!isset($_GET['static'])) 
		{

		if(isset($_GET['open']) AND isset($_GET['view'])) 
			{
			$path = "module/content/".$_GET['open']."/".$_GET['view'].".php";
			if(isset($_GET['view']) AND file_exists($path)) {
   				include("module/content/".$_GET['open']."/".$_GET['view'].".php");
			}
			else 
				{
				include('module/content/welcome.php');
				}
  		} 
  			else	
				{
    			include('module/content/welcome.php');
  				}
	}
	else 
	{
		switch($_GET['static']) 
		{			
			default:
			$static = "module/content/".$_GET['static'].".php";
			include($static);
			break;
		}
	}
}
else 
	{
	if($_GET['action'] == 'pw_vergessen') 
		{
		include('module/content/pw_vergessen.php');
		}
		else
		{
		include('module/content/login.php');
		}
	}
?>
 
Also wenn du das schon so machen willst, dann würde ich das wie folgt regeln:

PHP:
switch($page) {
    case 'welcome':
        include 'module/content/welcome.php';
        break;

    case 'pw_vergessen':
        include 'module/content/pw_vergessen.php';
        break;

    case 'login':
        include 'module/content/login.php';
        break;
    
    case 'sonstige_seite':
        include 'module/content/sonstige/seite.php';
        break;

    default:
        exit("page ". $_GET['page'] . " unbekannt");
}

Denn wenn du dem User erlaubst die GET-Variablen ungeprüft im Code zu übernehmen:
PHP:
include("module/content/".$_GET['open']."/".$_GET['view'].".php");
dann kann jeder benutzer fast beliebige Dateien auslesen:

So hast du z.B. einen Loop gebaut, falls deine Startseite die index.php ist und sich immer wieder selbst included:
PHP:
$_GET['open'] = '.';
$_GET['view'] = 'index';

Denn die Seiten sind meist statisch und sind meistens weniger als 20. Diese 20 in einem Switch sind ok - zur Not bauste dir n Script das aus der Config automatisch das korrekte script auswählt:
PHP:
function getInlcudePath($page) {
    $cfg['pw_vergessen'] = 'module/content/pw_vergessen.php';
    ...

    if(!isset($cfg[$page])) {
        return null;
    }
    else return $cfg[$page];
}

$pageToInclude = getIncludePath($_GET['page']);
if($pageToInclude !== null) {
    include $pageToInclude;
}
else {
  exit("foo");
}
 
Hm ja aber das problem ist das das script oben von mir ja auch überprüft ob die Files da sind. Weil so ist das dynamisch. Wenn der Ordner da ist gehts und wenn nicht dann nicht. So kann ich den Ordner einfach herausnehmen und es geht trotzdem und gibt keine Probleme. Daher würde ich das schon gerne grob so weiter beibehalten oder gibts da ne andere möglichkeit?
 
Ich würde das nicht so machen. Aber wenn du das beibehalten willst, dann überprüf bitte die Syntax der Eingabevariablen, ob da nicht jemand ungebetene Dateien aufrufen will:

PHP:
if(!preg_match('/^[a-zA-Z0-9_-]+$/',$_GET['open'])) {
    exit("fehlermeldung");
}

Vielleicht ein VOrschlag der dir eher gefällt:

Du übergibst als action einen string mit dem du die Ordnerstruktur durch Underscrores angibst:

PHP:
$_GET['action'] = "content_login";

if(!preg_match('/^[a-zA-Z0-9_-]+$/', $_GET['action'])) {
    exit("fehlermeldung");
}

$seitenteile = explode('_',$_GET['action']);

$path = 'module/'.implode('/',$seitenteile) .".php";

if(file_exists($path) && realpath($path) != __FILE__) {
    include $path ;
}

So kannst du in der gleichen Variable mehere Teile unterbringen die durch einen Underscore getrennt sind.


Edit: Ich hab den Fehler in meinem vorherigen Posten entdeckt - jetzt weis ich warum die Angriffsmethode nicht erkennst:
PHP:
$_GET['view'] = '../../index';

Du kannst im Pfad beliebig viele ../ angeben um dadurch andere Dateien zu laden, als eigentlich Beabsichtigt ist. So kann dir jemand, der dich nicht mag, deinen Server mit 100% Last zumüllen und deine Seite geht gar nicht mehr.
 
Zuletzt bearbeitet:
Hm ich kann dir glaube nicht folgen was du damit vorhast.. bzw was ich damit genau anfangen soll :( hmmmmm
 
Beispiele:
Code:
$_GET['action']  ---->  $path
test             ----> modules/test.php
test_test        ----> modules/test/test.php
content_login    ----> modules/content/login.php
content_pwvergessen -> modules/content/pwvergessen.php
a_b_c_d          ----> modules/a/b/c/d.php
../../foo        ----> NULL -> error

Das macht das Script. Du wolltest mit einer Variablen mehr includen können als nur die 2 Scripte die du angegeben hast. So kannst du mit einer Variablen alle Scripte laden, die du willst - egal in welchen Ordnerstrukturen sie liegen.

Oder was genau willst du :)?
 
Achso dann muss ich beim aufrufen der var immer gleich die ordnerstruktur mit übergeben ?
Hmm naja dann müsste ich meine ganzen 232343 menüs jetzt wieder umstriken ;) ist kein pappenstil :/ würde gerne probieren das script oben von mir zu erweitern.. ansonsten müsste ich halt unten immer ein Elsif einbauen.. und das ist halt suboptimal ne?

PHP:
<?php
if(isset($myid) AND is_numeric($myid)) 
{
	if(!isset($_GET['static'])) 
		{

		if(isset($_GET['open']) AND isset($_GET['view'])) 
			{
			$path = "module/content/".$_GET['open']."/".$_GET['view'].".php";
			if(isset($_GET['view']) AND file_exists($path)) {
   				include("module/content/".$_GET['open']."/".$_GET['view'].".php");
			}
			else 
				{
				include('module/content/welcome.php');
				}
  		} 
  			else	
				{
    			include('module/content/welcome.php');
  				}
	}
	else 
	{
		switch($_GET['static']) 
		{			
			default:
			$static = "module/content/".$_GET['static'].".php";
			include($static);
			break;
		}
	}
}
else 
	{
	if($_GET['action'] == 'pw_vergessen') 
		{
		include('module/content/pw_vergessen.php');
		}
		else if($_GET['action'] == 'pwbestaetigen') 
		{
		include('module/content/pwbestaetigen.php');
		}
		else
		{
		include('module/content/login.php');
		}
	}
?>

So hab ich das nun erweitert. Würde halt gerne das so machen das ich zwischen static und open & view switche und das halt beides dynamisch irgendwie :/
 
Zuletzt bearbeitet:
Ja - aber ich befürchte du machst aus einer Mücke einen Elefanten. Du hast für die gleiche Funktionalität (include aus dem module verzeichnis) 3 Unterschiedliche Variablen.

Warum?

Macht doch alles nur unnötig kompliziert. Ich sehe keinen logischen Grund - mal abgesehen von der Faulheit die bestehenden unnötigen Strukturen umzubauen - das nicht in eine Variable zu packen, die ausgewertet wird.
 
ne ist ja eben nicht aus dem selben verzeichnis :) das ist ja das problem :(

die dateien die mit $_GET['open'] und view $_GET['view'] included werden sollen sind ja jeweils in einem modul ordner der mit OPEN ..also dem Modulnamen deklariert wird. Und die "Static" files liegen in dem Content Ordner. Und der 3. typ von files liegt auch im content Ordner aber soll möglichst mit action aufgerufen werden.
 
Zurück
Oben