-2

如何创建一个动态的 PHP 包含,这是安全的?例如,我有一个 index.php 文件,其中包含 header.php 和 footer.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 回答