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站点,其中包含以下代码:

<?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和假参数。