PHP安全地包含文件+处理无效参数

时间:2017-11-15 13:26:35

标签: php security include

我有一点问题。如果参数无效,我想安全地从子目录+句柄中包含基于$ _GET参数的文件。

 <?php
if(isset($_GET['p']) && $_GET['p'] == 'fahrzeuge'){
        include 'includes/cars.php';
    }
  if(isset($_GET['p']) && $_GET['p'] == 'impressum'){
        include 'includes/impressum.php';
    }
    if(isset($_GET['p']) && $_GET['p'] == 'home'){
            include 'includes/home.php';
        }
      if(isset($_GET['p']) && $_GET['p'] == 'anfahrt'){
            include 'includes/anfahrt.php';
        }
        if(isset($_GET['p']) && $_GET['p'] == 'about'){
                include 'includes/about.php';
            }

?>

这是我的代码。对不起,我知道这是一个解决这个问题的方法。我怎样才能改进它?任何建议/帮助将受到高度赞赏

2 个答案:

答案 0 :(得分:2)

设置合法页面数组。如果设置了$_GET['p'],请检查一次,如果是,请将其值(在转义之后)分配给变量$p

然后检查您的pages数组中是否定义了请求的页面($p),如果是这样 - 包括它。

$pages = array('about','contact','home');

$p = 'home'; //Default page
if(isset($_GET['p'])) {
  $p = $_GET['p']; //no need to escape as we compare it to predefined values as @Yoshi suggested
} 

if(in_array($p, $pages)){
  include 'includes/'.$p.'.php';
} else {
   include 'includes/home.php';
}

答案 1 :(得分:0)

我会使用ternary设置一个变量来告诉页面要包含的内容。

这与Ofir Baruch的回答非常相似,只是更短。

$pages = array('about','contact','home');

$p = isset($_GET['p']) && in_array($_GET['p'], $pages)? $_GET['p'] : 'home';
include "includes/{$p}.php";

基本上,您有一系列可能的页面。在三元组中,我们检查是否设置了$_GET['p']isset()),并检查它包含的值是否在数组中。如果是,我们将$_GET['p']用作$p,如果不是,我们将$p设置为home,这意味着home始终是默认值如果未设置$_GET['p'],或者根据数组没有设置有效页面。