php获取变量

php获取变量,php,get,Php,Get,我是php新手,需要一些关于“GET”变量的帮助 下面是我的index.php代码的摘录: $array = array("section","view","sub","cat","point"); $i = 0; $check = true; foreach ($_GET as $position => $wert) { if ($position != $array[$i]) { //if GET doesnt exist in the array set check t

我是php新手,需要一些关于“GET”变量的帮助

下面是我的index.php代码的摘录:

$array = array("section","view","sub","cat","point");
$i = 0;
$check = true;

foreach ($_GET as $position => $wert) {
  if ($position != $array[$i]) {
    //if GET doesnt exist in the array set check to false
    $check = false;
    break;
  }
  $i++;
}

//if GET variables exists
if ($check == true) {
  if (isset($_GET['section'], $_GET['view'], $_GET['sub'], $_GET['cat'], $_GET['point'], $point[$_GET['point']])) {
    $path = $path_dynamic.$_GET['section']."/".$_GET['view']."/".$_GET['sub']."/".$_GET['cat']."/".$point[$_GET['point']];
    check($path);
  } else if (isset($_GET['section'], $_GET['view'], $_GET['sub'], $_GET['cat'], $cat[$_GET['cat']])) {
    $path = $path_dynamic.$_GET['section']."/".$_GET['view']."/".$_GET['sub']."/".$cat[$_GET['cat']];
    check($path);
  } else if (isset($_GET['section'], $_GET['view'], $_GET['sub'], $sub[$_GET['sub']])) {
    $path = $path_dynamic.$_GET['section']."/".$_GET['view']."/".$sub[$_GET['sub']];
    check($path);
  } else if (isset($_GET['section'], $_GET['view'], $view[$_GET['view']])) {
    $path = $path_dynamic.$_GET['section']."/".$view[$_GET['view']];
    check($path);
  } else if (isset($_GET['section'], $section[$_GET['section']])) {
    $path = $path_dynamic.$section[$_GET['section']];
    check($path);
    //if section isn't set
  } else if (!isset($_GET['section'])) {
    include ($path_dynamic.$section['news']);
  }
} else {
  echo "GET doesn't exist";
  include ($path_static.$section['error']);
}

//check if GET exists
function check($path) {
  if (file_exists($path)) {
    echo "File imported<br />";
    include ($path);
  } else {
    echo "GET set correct but file doens't exist";
    include ('include/static/fehler.html');
  }
}
我的问题是,如果设置此链接:

index.php?section=verein&view=vorstande
“vorstande”在我的视图数组中不存在。因此,代码检查“verein”部分并包含“verein”。但它应该给出一个错误

所以看起来这个代码

 } else if (isset($_GET['section'], $_GET['view'], $view[$_GET['view']])) {
被忽略,并跳转到

  } else if (isset($_GET['section'], $section[$_GET['section']])) {
如果我将我的url更改为:

index.php?section=vereine&view=vorstande
index.php?section=vereine&view=vorstand
什么也没发生。我甚至不知道代码现在在哪里

但如果我将url更改为:

index.php?section=vereine&view=vorstande
index.php?section=vereine&view=vorstand
一切正常

所以“verein”和“vorstand”是我定义的。“vereine”和“vorstande”不存在

有什么建议吗?Sry以德语发表评论。回音只提示代码现在在哪里

致我的HP:

编辑: -翻译评论,以便更好地交谈 -删除了所有“$…[$\u GET['…']]”结构,以显示我将得到的错误。

问题在于:

} else if (isset($_GET['section'], $_GET['view'], $view[$_GET['view']])) {
isset
的每个参数必须为true,语句才能返回true。在您的示例中,设置了
$\u GET['section']
$\u GET['view']
,但未设置
$view[$\u GET['view']]
,因此在下一个
行继续执行,否则,如果

要解决此问题,请在前面设置
$view[$\u GET['view']]
,或者删除该参数

“vorstande”在我的视图数组中不存在。所以代码检查 “verein”部分,包括“verein”。但它应该给出一个错误

“给出错误”的意思是
$check=false

} else if (isset($_GET['section'], $_GET['view'], $view[$_GET['view']])) {
如果在$view中键
vorstande
不存在,则整个条件将计算为
false
,并检查下一个条件:

} else if (isset($_GET['section'], $section[$_GET['section']])) {
编辑:

您的代码:

else if (isset($_GET['section'], $_GET['view'], $view[$_GET['view']])) {
    $path = $path_dynamic.$_GET['section']."/".$view[$_GET['view']];
    check($path);
}
您的要求:

if (!isset($view[$_GET['view']]))
    check(/* something invalid to display fehler.html */ false);
实际发生的情况:

isset($_GET['section'])     // true
isset($_GET['view'])        // true
isset($view[$_GET['view']]) // FALSE

=> isset($_GET['section'], $_GET['view'], $view[$_GET['view']]) // FALSE
如果
$\u GET['view']
$view
中不存在,则将调用
检查的块不会执行。如果希望不考虑执行,只需删除条件
isset($view[$\u GET['view']])

如果您不喜欢这种方法,请处理您的案例。您有一个案例用于
部分isset和视图isset和视图有效
。下一种情况忽略
视图
参数。因此,如果您的
视图
参数无效,您的代码会像未设置一样处理它。不过,要求对
部分isset和视图isset和视图无效进行说明:

else if (isset($_GET['section'], $_GET['view']) && !isset($view[$_GET['view']])) {
    check(false);
}
这当然是非常冗余的检查,所以只需将其嵌套到以下内容:

else if (isset($_GET['section'], $_GET['view']))
{
     // section and view have been passed

     if (isset($view[$_GET['view']])
         // view is actually valid
         $path = $path_dynamic.$_GET['section']."/".$view[$_GET['view']];

     else
         // view has been passed but is invalid. show fehler.html
         $path = false;

     check($path);
}
备选示例

如果我理解正确,您有以下要求:如果用户传递参数
部分
视图
,您希望该值也在有效值列表中。如果不是,则要显示
fehler.html

现在,我们首先确保,如果设置了参数,则该参数也是有效的:

foreach ($array as $param)
{
    // example for $param == "view":
    // !isset( $view[$_GET["view"]] )
    if (!isset( ${$param}[$_GET[$param]] ))
    {
        $check = false;
        break;
    }
}
然后,我们检查所有参数组合,并构建一个
$path

$path = false;
if ($check)
{
    // your long if isset else if isset block where 
    // isset($_GET['view']) also implies isset($view[$_GET['view']])
    // so you don't have to check for it.

    // just set the $path variable with some string.
    // we are going to check it later
}
如果现在初始的
$check
失败,或者我们构建了无效的
$path
,请显示
fehler.html

if ($check === false || !file_exists($path))
{
    // display fehler.html
}
else
    include($path);

在哪里分配$view数组?似乎只有将$view[$\u GET['view']]设置在某个位置时才应该设置它。否则它将不会被设置(只要你不使用register globals)。我相信代码会喜欢被干涸一点:)而且,英语是在那个网站上用来交流的语言,所以也许你应该翻译你的评论。哦,顺便说一句,这很容易被本地文件以最糟糕的方式包含。俄罗斯黑客会在2分钟内登陆你的网站,如果你像这样上网:)@Ynhockey:Im不使用register globals。My$view数组是在index.php的开头分配的。我在那里创建了所有数组$section、$view、$sub、$cat和$point。我在空闲时间学习php fpr两个月,这是我的第一个项目。我确信有很多糟糕的编程部分。但是我的网站并没有那么重要,它会被俄罗斯人入侵,我想xD,所以有什么讲座可以学习更多关于安全方面的知识吗?只要读一篇LFI的文章就可以了。现在就说重点。本以为file_exist会有帮助,但注入的文件也会返回true。切换是可能的。但是如果我定义每个GET参数的每个值(它们超过50个),那么代码就会变得一团糟。有什么想法吗?还有一个干洗的建议?顺便说一句,更新页面时没有Geroge Cummins发布的最后一个参数。但是现在如何摆脱“未定义的索引”部分呢?我还将附和其他人的评论:您发布的代码需要重新修改以提高安全性和可维护性。您能否将其添加到答案本身,并可能简要解释LFI的危险性?然后你得到了我的投票:)如果我删除部分$view[$\u GET['view']],我会得到像“undefined”索引这样的错误。我只想显示我的错误页面:>我所说的错误是指我自己的错误,包括“fehler.html”部分,而不是phpAdded给出的错误代码。这里没有什么没有说的。添加了一个关于如何更有效地解决问题的替代示例。非常感谢您的解释。我读了更多关于LFI的书。一个源实现文件_exist部分作为解决方案,另一个源使用switch检查数组中是否存在变量。文件_是否仅检查源是否在我的服务器上可用?或者对于这种方法,插入的文件是否也会返回true?不知道“插入的文件”是什么意思,但是
文件\u存在
只是检查文件
$path
是否存在并且是否可供Web服务器访问。