2011-07-25 4 views
8

私は素晴らしい作品が、私は(190のような)多くの多くのファイルを持っていると私は何とこのcase文の多くの作品を作るための方法は、私がそこにあるかどうかを知るのが大好きだ、このPHPのcase文このcase文を簡略化する方法はありますか?

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

} 

を持っています190のケース条件を行う必要はありません。私はこのケースでcondtionを使うことができると思っていました。おそらくそのファイルが存在するかどうかを確認し、もし表示されていれば、おそらく404ページでしたが、これを行う良い方法はわかりませんでした。それはより安全たとえばあなたが$parts[count($parts) - 1]

答えて

4

、あなたはこれをしない、

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

繰り返すようにそれを行うことができます!

+0

'file_exists($ include)'に関してあなたは確かですか?それは単に道の一部です。それは常に「偽」です。 –

+0

あなたのコメントの数分前に編集しました – genesis

+0

申し訳ありません:)答えのコードを確認するための+1 :) –

2

これはセキュリティチェックのない単純な実装ですか?それはユーザーの入力ではない場合は$は、ユーザーの入力から充填されているが含まれている場合

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

if (file_exists($include_file)) 
{ 
    include($include_file); 
} 
+0

これは、ユーザーの入力がある場合、これは巨大なセキュリティリスクです! ../../../../etc/passwd ??? – genesis

+0

私はセキュリティチェックを書いていないと言っていましたが、例えばスラッシュやダブルドットを削除することができます – mck89

+0

セキュリティチェックがサンプルに追加されると直ちにupvoteします。 – mskfisher

1

なぜこのようなものからスラッシュを削除することができようにするには

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

:たくさん

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

ファイルが存在することを確認してください。

$pageの内容を検証して、ファイルシステム上の他の場所をユーザー入力とする場合には/../../../../のようなパスが含まれていないことを確認する必要があります。

あなたが知っている場合は、すべてのパスがアンダースコアと英数字になることを、たとえば、あなたができる:

$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

preg_matchを実行する2番目のif文は、$ page = $ parts [count($ parts )] - 1;または後で正確にそれが確認されていますか? – Trace

+0

@Tamerは 'preg_match()if()'の中に 'if()'を置きます。 –

15

あなたは、アレイ内のファイル名を事前に定義して、名前の存在をチェックするために、in_arrayを使用することができます。

$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 –

+1

ホワイトリストは良いコンセプトですが、手動で190エントリ(これ以上変わる可能性が高い)を手動で維持することは、少なくとも面倒です。 pages /ディレクトリでscandir()を使用し、ホワイトリスト自体としてディレクトリを使用することで、ホワイトリストを構築することが望ましいでしょう。 –

+0

scandir()を使用してそのホワイトリストを構築する方法 – Trace

1

別のアプローチは、与えられたファイルが実際に特定のディレクトリに存在するかどうかを確認するために、次のようになります。

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php'; 
if (is_file($file)) include($file); 
関連する問題