2011-07-25 11 views
8

ho questo caso PHP dichiarazioneC'è un modo per semplificare questa dichiarazione del caso?

switch ($parts[count($parts) - 1]) { 
    case 'restaurant_pos': 
     include($_SERVER['DOCUMENT_ROOT'] . '/pages/restaurant_pos.php'); 
     break; 
    case 'retail_pos': 
    include($_SERVER['DOCUMENT_ROOT'] . '/pages/retail_pos.php'); 
     break; 
    ..... 

} 

Quali grandi opere, ma ho molti molti file (come 190) e mi piacerebbe sapere se c'è un modo per fare questo caso dichiarazione molti lavorano con qualsiasi cosa così io non devi fare 190 condizioni di caso. Stavo pensando di poter usare la condtion nel caso e magari vedere se quel file è presente e se è così poi visualizzare e se non poi forse una pagina 404 ma non ero sicuro di un buon modo per farlo ... qualche idea aiuterebbe alot

risposta

4

Se non è l'input dell'utente, è possibile farlo come

$include = $parts[count($parts) - 1]; 
if ($include) { 
    if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/pages/'.$include.'.php')){ 
      include $_SERVER['DOCUMENT_ROOT'] . '/pages/'.$include.'.php'; 
    } 
} 

ripetere, non farlo se $ INCLUDE viene riempito dall'input dell'utente!

+0

Sei sicuro riguardo 'file_exists ($ include)'? È solo una parte del percorso. Sarà sempre 'falso'. –

+0

L'ho modificato pochi minuti prima del tuo commento – genesis

+0

Scusa :) +1 per la revisione del codice nella risposta :) –

2

questa è una semplice implementazione, senza controlli di sicurezza:

$file=$_SERVER['DOCUMENT_ROOT']."/pages/".$parts[count($parts) - 1].".php"; 
if(file_exists($file)) include $file; 
else show404(); 

per renderlo più sicuro, ad esempio è possibile rimuovere le barre da $parts[count($parts) - 1]

+0

questo è un enorme rischio per la sicurezza se si tratta di input dell'utente! ../../../../etc/passwd ??? – genesis

+0

Come ho già detto non ho scritto i controlli di sicurezza ma è possibile ad esempio rimuovere le barre o i doppi punti – mck89

+0

Investo non appena i controlli di sicurezza vengono aggiunti all'esempio. – mskfisher

1

Perché non qualcosa di simile?

$include_file = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $parts[count($parts) - 1] . '.php'; 

if (file_exists($include_file)) 
{ 
    include($include_file); 
} 
1
if (file_exists($path = $_SERVER['DOCUMENT_ROOT'].'/pages/'.$parts[count($parts) - 1].'.php') 
{ 
    include $path; 
} 
2

Verificare che il file esista e quindi includerlo.

Si noti che è necessario convalidare il contenuto di $page per essere sicuri che non include un percorso come /../../../../ per tentare di leggere da qualche altra parte sul vostro filesystem, se questo deve essere l'input dell'utente.

Se si conosce, ad esempio, che tutti i percorsi saranno alfanumerico di sottolineatura, si potrebbe fare:

$page = $parts[count($parts)] - 1; 

if (preg_match('/^[A-Z0-9_]+$/i', $page)) { 
    // it's okay, so include it. 
    if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/pages/$page.php") { 
    include($_SERVER['DOCUMENT_ROOT'] . "/pages/$page.php"); 
    } 
} 
+0

la seconda istruzione if che fa il preg_match ... dovrebbe andare prima della pagina $ = $ parti [contare ($ parti)] - 1; o dopo e che cosa sta verificando esattamente – Trace

+0

@Tamer posiziona il 'if()' all'interno di 'preg_match() if()' Modificherò la risposta sopra. –

15

È possibile predefinire i nomi di file in un array e quindi utilizzare in_array al fine di verificare il proprio nome esistenza:

$files = array('restaurant_pos', 'retail_pos', ......); 
$file = $parts[count($parts) - 1]; 
if (in_array($file, $files)) { 
    include($_SERVER['DOCUMENT_ROOT'] . "/pages/$file.php"); 
} 
+2

+1 per approccio white list –

+1

La whitelist è un buon concetto, ma mantenere manualmente 190 voci (che più probabilmente cambieranno) è ingombrante almeno. Sarebbe preferibile costruire la whitelist usando scandir() nelle pagine/directory, e usando la directory come whitelist stessa. –

+0

come si costruisce quella whitelist usando scandir() – Trace

1

un altro approccio sarebbe quello di controllare se il file specificato esiste davvero in una particolare directory:

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php'; 
if (is_file($file)) include($file); 
Problemi correlati