2011-07-25 6 views
8

mam tej instrukcji case PHPCzy istnieje sposób na uproszczenie tego przypadku?

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; 
    ..... 

} 

który działa świetnie, ale mam wielu wielu plików (jak 190) i chciałbym wiedzieć, czy istnieje sposób, aby ten case wiele pracy z czymś tak ja nie musisz robić 190 przypadków. Pomyślałem, że mogę użyć warunku w tej sprawie i może zobaczę, czy ten plik jest obecny, a jeśli tak, to wyświetl, a jeśli nie, to może strona 404, ale nie byłam pewna, czy to dobry sposób ... wszelkie pomysły pomogłyby dużo

Odpowiedz

4

Jeśli to nie jest wprowadzane przez użytkownika, można to zrobić jak

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

powtarzając, nie rób tego, jeśli $ obejmować jest napełniany od wejścia użytkownika!

+0

Czy jesteś pewien co do 'file_exists ($ include)'? To tylko część ścieżki. Zawsze będzie to "fałsz". –

+0

Edytowałem to kilka minut przed twoim komentarzem – genesis

+0

Przepraszam :) +1 za przejrzenie kodu w odpowiedzi :) –

2

jest to prosta implementacja bez kontroli bezpieczeństwa:

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

Aby uczynić go bardziej bezpieczne na przykład można usunąć ukośniki z $parts[count($parts) - 1]

+0

Jest to ogromne zagrożenie dla bezpieczeństwa, jeśli jest to dane wprowadzone przez użytkownika! ../../../../etc/passwd ??? – genesis

+0

Jak już powiedziałem, nie napisałem sprawdzianów bezpieczeństwa, ale możesz na przykład usunąć ukośniki lub podwójne kropki. – mck89

+0

Rozpatrzę, jak tylko zostaną dodane kontrole bezpieczeństwa do przykładu. – mskfisher

1

Dlaczego nie coś takiego?

$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

Sprawdź, czy plik istnieje, a następnie dołącz go.

Należy pamiętać, aby sprawdzić poprawność zawartości $page, aby upewnić się, że nie zawiera ona ścieżki takiej jak /../../../../, aby spróbować odczytać gdzieś indziej w systemie plików, jeśli ma to być dane wejściowe użytkownika.

Jeśli wiesz na przykład, że wszystkie ścieżki będą alfanumeryczny podkreślenia, można zrobić:

$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

Drugie zdanie if, które robi preg_match ... powinno iść przed $ page = $ parts [count ($ parts)] - 1; lub po tym, co dokładnie sprawdza w ten sposób: – Trace

+0

@Tamer umieść 'if()' wewnątrz 'preg_match() if()' Zmodyfikuję powyższą odpowiedź. –

15

Można wstępnie zdefiniować nazwy plików w tablicy, a następnie użyć in_array w celu sprawdzenia istnienia Nazwa użytkownika:

$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 w przypadku białej listy –

+1

Biała lista jest dobrym pomysłem, ale ręczne zachowanie 190 wpisów (które najprawdopodobniej ulegną zmianie) jest co najmniej kłopotliwe. Lepiej byłoby zbudować białą listę za pomocą scandir() na stronach/katalogu i używając katalogu jako białej listy. –

+0

jak zbudowałbyś tę białą listę używając scandir() – Trace

1

Innym rozwiązaniem byłoby sprawdzić, czy dany plik naprawdę istnieje w danym katalogu:

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