【问题标题】:Basic navigation with PHP not workingPHP的基本导航不起作用
【发布时间】:2014-05-27 11:31:17
【问题描述】:

我有以下 PHP 页面:

index.php

   if( isset($_POST['location']) ) {
            $location = $_POST['location'];

   } else {
        $location = 'home';
    }

require 'header.php';

switch ($location) {
    case "home": require 'home.php'; break;
    case "about": require 'about.php'; break;
    case "products": require 'products.php'; break;
    case "budget": require 'budget.php'; break;
    case "contact": require 'contact.php'; break;
    case "help": require 'help.php'; break;
    default: require 'home.php';
}

require 'footer.php';

?>

在我拥有的 HEADER 内:

header.php

<body class="<?php echo $location; ?>">

<div id="navmenu">
    <ul id="menu">
        <li><a id="page_item_1" href="?location=home">Home</a></li>
        <li><a id="page_item_2" href="?location=about">About</a></li>
        <li><a id="page_item_3" href="?location=products">Products</a></li>
        <li><a id="page_item_4" href="?location=budget">Budget</a></li>
        <li><a id="page_item_5" href="?location=contacto">Contact</a></li>
        <li><a id="page_item_6" href="?location=help">Help</a></li>
    </ul>
</div>

但是没有任何效果...位置 POST 发生了变化,但主体的类没有改变。并且正文的内容需要(不加载 home/about/etc.php)。

我做错了什么? 谢谢。

【问题讨论】:

  • fyi,&lt;body class="&lt;?php echo $location ?&gt;"&gt; 对 XSS 开放
  • 你在 body 类中少了一个分号
  • XSS 问题是分号?我将它添加到我的代码中。
  • @user3529213 在该特定行中不需要分号,因为它后跟结束标记?&gt;XSS 问题是您无法防止用户将 javascript 添加到 $_GET['location'] var,因此当您在 html 中回显 $location 时,允许将任意代码注入页面。在向用户显示用户提供的数据时,您应该使用htmlentities()
  • 好的,我读了那部分,这是一本很长的圣经,你能否更具体地说明我应该使用 htmlentities() 的什么特性?或者某个示例的链接?提前致谢。

标签: php html css post classname


【解决方案1】:

您使用 GET 而不是 POST + 为什么不使用 $location + "php"? :

if( isset($_GET['location']) ) {
            $location = $_GET['location'];

} else {
        $location = 'home';
    }
require 'header.php';
require $location . '.php';
require 'footer.php';

【讨论】:

  • 但问题是浏览器会尝试打开用户在导航栏上手动输入的任何内容......所以如果他拼错了,他会得到一个页面的残骸,有 2 个大的黑色错误,什么也没有正在加载...有什么办法可以避免这种情况?
  • 好吧,我想通了,我使用了 file_exists();在加载需求之前检查文件是否存在。非常感谢。
  • 你可以在 bool file_exists ( string $filename ) 之前检查页面是否存在
  • -1 用于巨大的安全风险目录/路径遍历和文件包含。 en.wikipedia.org/wiki/File_inclusion_vulnerability
【解决方案2】:

更改您的帖子以获得.. 即

if( isset($_GET['location']) ) {
    $location = $_GET['location'];
} else {
   $location = 'home'; 
}

【讨论】:

    【解决方案3】:

    你通过GET而不是POST传递东西。

    if( isset($_GET['location']) ) {
        $location = $_GET['location'];
    } else {
        $location = 'home';
    }
    

    为了将来参考,您可以打印GETPOST 变量以查看其中包含什么:

    print_r($_GET);
    

    在这个主题上,$_REQUEST 包含它们:

    print_r($_REQUEST);
    

    要发送 POST 数据,您必须使用表单发送它们 - 这里无关紧要。您在 URL 查询字符串中看到的是 GET 数据,而不是 POST

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      相关资源
      最近更新 更多