Php 基于(未定义的)变量包含文件时出现问题
我有一个PHP站点,其中包含以下代码:Php 基于(未定义的)变量包含文件时出现问题,php,Php,我有一个PHP站点,其中包含以下代码: <?php $p = $_GET['p'] include("$p.inc"); ?> 但是这不起作用,因为现在$p总是包含字符串“start”,我不能再将访问者发送到index.php?p=contact——它仍然包含start.inc 有人能帮我解决这个问题吗? 提前谢谢 为了安全起见,你还是应该把你的页面列成白名单。因此: <?php $p = $_GET['p'] switch($p){ case 'co
<?php
$p = $_GET['p']
include("$p.inc");
?>
但是这不起作用,因为现在$p总是包含字符串“start”,我不能再将访问者发送到index.php?p=contact
——它仍然包含start.inc
有人能帮我解决这个问题吗?
提前谢谢 为了安全起见,你还是应该把你的页面列成白名单。因此:
<?php
$p = $_GET['p']
switch($p){
case 'contact':
include("contact.inc");
break;
default:
include("start.inc");
}
?>
为了安全起见,您还是应该将页面列为白名单。因此:
<?php
$p = $_GET['p']
switch($p){
case 'contact':
include("contact.inc");
break;
default:
include("start.inc");
}
?>
您应该更喜欢Nanne建议的数组映射或
开关
如果要继续在include语句中直接使用$p变量,至少要使用basename()。这就是如何避免“错误”(顺便说一句,这是调试通知):
您应该更喜欢Nanne建议的数组映射或开关
如果要继续在include语句中直接使用$p变量,至少要使用basename()。这就是如何避免“错误”(顺便说一句,这是调试通知):
如下定义$p变量:
$p = array_key_exists('p', $_GET) ? preg_replace('!\W!', '', $_GET['p']) : 'start';
如下所示定义$p变量:
$p = array_key_exists('p', $_GET) ? preg_replace('!\W!', '', $_GET['p']) : 'start';
您正在检查$p而不是$\u GET['p'],因此,由于$p从未设置,所以您总是在起始页着陆。
无论如何,您必须先清理此变量。
好的实践是这样的(假设页面存储在“pagedata”文件夹中并且具有.php扩展名):
您正在检查$p而不是$\u GET['p'],因此,由于$p从未设置,所以您总是在起始页着陆。
无论如何,您必须先清理此变量。
好的实践是这样的(假设页面存储在“pagedata”文件夹中并且具有.php扩展名):
明确指定允许的值, 从外面获得的
<?php
$allowed_pages = array(
'home' => 'home.inc',
'contact' => 'contact.inc',
);
$page = @$_GET['p'];
$file = array_key_exists($page, $allowed_pages) ? $allowed_pages[$page] : $allowed_pages['home'];
include($file);
?>
明确指定允许的值, 从外面获得的
<?php
$allowed_pages = array(
'home' => 'home.inc',
'contact' => 'contact.inc',
);
$page = @$_GET['p'];
$file = array_key_exists($page, $allowed_pages) ? $allowed_pages[$page] : $allowed_pages['home'];
include($file);
?>
谢谢大家
我将您的大部分建议合并到以下代码中:
<?php
$pages = array(
'start'=>'Start.inc';
'contact'=>'Contact.inc';
'about'=>'About.inc';
};
$p = array_key_exists(@$_GET['p'], $pages) ? preg_replace('!\W!', '', $_GET['p'] : 'start';
$p = ucfirst($p);
$page = "./$p.inc";
if(is_readable($page)) include($page);
else include(./404.);
?>
谢谢大家
我将您的大部分建议合并到以下代码中:
<?php
$pages = array(
'start'=>'Start.inc';
'contact'=>'Contact.inc';
'about'=>'About.inc';
};
$p = array_key_exists(@$_GET['p'], $pages) ? preg_replace('!\W!', '', $_GET['p'] : 'start';
$p = ucfirst($p);
$page = "./$p.inc";
if(is_readable($page)) include($page);
else include(./404.);
?>
请您解释一下下面的内容好吗<代码>$p=preg\u replace(“/\W+/”,“,$p)代码>是。这是一个正则表达式过滤器。它删除所有“非单词”字符。意思是只留下字母、数字或下划线。啊,谢谢!我想如果变量是由访问者操纵的,这是非常有用的?如果我是唯一负责代码的人,我不需要过滤我的变量,对吗?安全总比抱歉好。如果你是唯一一个使用该网站的人,那么是的。但是,任何用户都可以手动输入URL和一个伪参数。您介意解释一下下面的内容吗<代码>$p=preg\u replace(“/\W+/”,“,$p)代码>是。这是一个正则表达式过滤器。它删除所有“非单词”字符。意思是只留下字母、数字或下划线。啊,谢谢!我想如果变量是由访问者操纵的,这是非常有用的?如果我是唯一负责代码的人,我不需要过滤我的变量,对吗?安全总比抱歉好。如果你是唯一一个使用该网站的人,那么是的。但除此之外,任何用户都可以手动输入URL和假参数。