php获取变量
我是php新手,需要一些关于“GET”变量的帮助 下面是我的index.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
$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服务器访问。