-2

安全な動的PHPインクルードを作成するにはどうすればよいですか?たとえば、header.phpとfooter.phpが含まれているindex.phpファイルがあり、その間に他のページを取得します。

index.php?page=about

可能であれば、動的である必要があるため、配列とケースの使用には時間がかかり、変更が必要になります。

また、どのページが含まれているかに応じて、ウェブサイトのタイトルも変更できるようにしたいと思います。

私は現在これを実施しています:

<?php
require_once 'includes/config.php';
//Set values for page  
$page_title = 'home page';
$current_page = 'home';

require_once 'includes/header.php';
?>


CONTENT


<?php
require_once 'includes/footer.php';
?>

ありがとう

これは私のページを含めるための安全な方法でしょうか?

if( isset( $_GET[ 'page' ] ) )
 {
   if( strpos( $_GET[ 'page' ], "/" ) )
     {
      $dir = substr( str_replace( ’’, ”, $_GET[ 'page' ] ), 0, strpos( $_GET[ 'page' ], "/" ) ) . "/";

      $file = substr( strrchr( $_GET['page' ], "/" ), 1 );
      if( file_exists( $dir.$file.".php" ) )
        {
         include( $dir.$file.".php" );
      } else {
         include( "home.php" );
      }
   } else {
      if( file_exists( basename( $_GET[ 'page' ] ).".php" ) ) 
        {
         include( basename( $_GET[ 'page' ] ).".php");
      } else {
         include( "404.php" );
      }
   }
} else {
   include( "home.php" );
} 
4

2 に答える 2

4

Webディレクトリ外のページや無効なページへのエラーや不正なファイルアクセス(安全)を防ぐには、次の手順を実行する必要があります。

ピリオドをチェックして$_GET['page']を検証します。ピリオドはファイル名で有効な場合がありますが、値からファイル名を作成しているように見えます。ピリオドは、ルートディレクトリへのアクセスを取得するためのブレークアウトの試みを示している可能性があります。

そこから、インクルードのファイルパスを作成し、file_existsを使用して、インクルードする前にファイルが存在することを確認します。

ページのタイトルの変更については、次のようにします。

<?php
$page_title = 'Default Title';
$page_to_include = 'default';

if( strpos($_GET['page'], '.') !== false ){
  //throw/display error - could be a breakout attempt
}
if( !file_exists(sprintf('page_includes/%s.php', $_GET['page'])) ){
  //requested page does not exists, throw or display error
}else{
  $page_to_include = sprintf('page_includes/%s.php', $_GET['page']);
}

//do page validation here with file_exists
ob_start();
include $page_to_include;
$included_page = ob_get_clean(); //gets contents and cleans the buffer and closes it

require_once 'includes/header.php';
echo $included_page;
require_once 'includes/footer.php';
?>

このようにして、ページが最初に含まれ、出力ではなくバッファに格納されます。これにより、ページをインクルードして$ page_titleを変更できます。その後、変更された$ page_titleをheader.phpスクリプトで使用して、タグ内に出力できます。

于 2012-07-06T15:01:12.207 に答える
0

タイトルを変更するだけですか?これをheader.phpに追加します

<title>
<?php
if(isset($_GET['page']) {
    echo $_GET['page'];
} else {
    echo 'My Site';
}
?>
</title>
于 2012-07-06T14:26:01.290 に答える