从GET参数中包含页面的安全方式?

Dis*_*oat 1 php security get include

我正在设置一个URL,其中的URL将是:

http://example.com/index.php?page=about
Run Code Online (Sandbox Code Playgroud)

实际上,他们将从更简单的URL重写.index.php将包含另一个页面,使用此代码:

if ( isset( $_GET['page'] ) )
{
    $page = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $_GET['page'] . '.php';
    if ( is_file( $page ) )
        include $page;
    else
        echo 'That page doesn\'t exist.';
}
Run Code Online (Sandbox Code Playgroud)

假设页面文件夹中的所有内容都非常安全,那么此代码是否安全?我已经防范了众所周知的目录黑客,即使用page=../../.passwd.还有什么我应该留意的吗?

Jon*_*and 9

切换案例可能更好

$page_name = $_GET['page'];

switch($page_name) {
case 'about':
 $page = $_SERVER['DOCUMENT_ROOT'] . '/pages/about.php';
 break;        
case 'home': //fall through to default
case default:
 $page = $_SERVER['DOCUMENT_ROOT'] . '/pages/home.php';
}

include $page;
Run Code Online (Sandbox Code Playgroud)

这样,没有任何注射问题.

编辑

另一种解决方案是设置一个专门用于处理页面名称转换为地址的类.

class Page {
  static private $pages = array ("about", "home");

  const DEFAULT_PAGE = "home";

  static public function includePage($page_name) {
    if (!in_array($page_name, self::$pages)) {
      $page_name = self::DEFAULT_PAGE;
    }
    include ($_SERVER['DOCUMENT_ROOT'] . '/pages/'.$page_name.'.php';);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,这一切都在一个类中进行管理,未来的更改更容易进行,而无需深入研究其他代码

以上编辑以反映请求.

  • 为此,我认为有一个平面数组`{'home','about'}`然后如果请求匹配其中一个,只需包含它(包含在路径中等)就更简单了.要包含的文件名将始终与URL中存在的页面匹配. (2认同)