2011-07-25 31 views
8

Tôi có này tuyên bố trường hợp PHPCó cách nào để đơn giản hóa tuyên bố trường hợp này không?

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

} 

Những công trình vĩ đại nhưng tôi có nhiều tác phẩm nhiều (như 190) và tôi rất thích biết nếu có một cách để làm cho tuyên bố trường hợp này nhiều công việc với bất cứ điều gì vì vậy tôi không phải làm điều kiện 190 trường hợp. Tôi đã nghĩ rằng tôi có thể sử dụng các condtion trong trường hợp và có thể xem nếu tập tin đó là hiện tại và nếu như vậy sau đó hiển thị và nếu không thì có thể một trang 404 nhưng tôi không chắc chắn một cách tốt để làm điều này ... bất kỳ ý tưởng sẽ giúp rất nhiều

Trả lời

4

Nếu nó không phải là người dùng nhập vào, bạn có thể làm điều đó như

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

lặp đi lặp lại, không làm điều này nếu $ bao gồm tổng thể được lấp đầy từ đầu vào của người dùng!

+0

Bạn có chắc chắn về 'file_exists ($ include)'? Nó chỉ là một phần của con đường. Nó sẽ luôn là 'sai'. –

+0

Tôi đã chỉnh sửa vài phút trước khi bình luận của bạn – genesis

+0

Xin lỗi :) +1 để xem mã trong câu trả lời :) –

2

Đây là một thực hiện đơn giản mà không cần kiểm tra an ninh:

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

để làm cho nó an toàn hơn ví dụ bạn có thể xóa dấu gạch chéo từ $parts[count($parts) - 1]

+0

đây là rủi ro bảo mật rất lớn nếu đó là đầu vào của người dùng! ../../../../etc/passwd ??? – genesis

+0

Như tôi đã nói tôi đã không viết kiểm tra bảo mật nhưng bạn có thể ví dụ loại bỏ dấu gạch chéo hoặc dấu chấm đôi – mck89

+0

Tôi sẽ upvote ngay sau khi kiểm tra an ninh được thêm vào ví dụ. – mskfisher

1

Tại sao không phải cái gì như thế này?

$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

Kiểm tra xem tệp có tồn tại không và sau đó bao gồm tệp.

Lưu ý rằng bạn PHẢI xác thực nội dung của $page để đảm bảo rằng nó không bao gồm đường dẫn như /../../../../ để cố gắng đọc ở đâu đó khác trên hệ thống tệp của bạn nếu đây là đầu vào của người dùng.

Nếu bạn biết, ví dụ rằng tất cả các con đường của bạn sẽ được tự chữ và số với dấu gạch dưới, bạn có thể làm:

$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

câu lệnh if thứ hai thực hiện lệnh preg_match ... nên trước $ page = $ parts [count ($ parts)] - 1; hoặc sau và chính xác là nó xác minh – Trace

+0

@Tamer đặt 'if()' bên trong 'preg_match() if()' tôi sẽ sửa đổi câu trả lời ở trên. –

15

Bạn có thể ấn định trước tên tập tin trong một mảng và sau đó sử dụng in_array để kiểm tra sự tồn tại của tên:

$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 cho cách tiếp cận danh sách trắng –

+1

Danh sách trắng là một khái niệm tốt, nhưng tự lưu giữ 190 mục nhập (có nhiều khả năng sẽ thay đổi) ít nhất là cồng kềnh. Nó sẽ là thích hợp hơn để xây dựng các danh sách trắng bằng cách sử dụng scandir() trên các trang/thư mục, và sử dụng thư mục với chính danh sách trắng. –

+0

cách bạn xây dựng danh sách trắng bằng cách sử dụng scandir() – Trace

1

cách tiếp cận khác là để kiểm tra xem các tập tin được thực sự tồn tại trong một thư mục cụ thể:

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php'; 
if (is_file($file)) include($file); 
Các vấn đề liên quan