使用$ _GET链接,同时使用isset cant查找页面

时间:2012-08-16 18:03:33

标签: php get include

我正在尝试获取链接:

  <a href='?p=bid?Sale_ID=$Sale_ID'>BID</a>

工作,但我一直收到“你请求的页面不存在”的消息,如果我使用这个链接,这个页面有效:

  <a href='include/bid.php?Sale_ID=$Sale_ID'>BID</a>

这让我相信我的问题在于isset im使用链接包含页面:

  <?php
  if (isset($_GET['p']) && $_GET['p'] != "") {
  $p = $_GET['p'];
  if (file_exists('include/'.$p.'.php')) {
  @include ('include/'.$p.'.php');
  } elseif (!file_exists('include/'.$p.'.php')) {
  echo 'Page you are requesting doesn´t exist<br><br>';
  }
  } else {
  @include ('include/login-form.php');
  }
  ?>

我已经尝试添加另一个用q替换p的设置,只是将我的页面抛入dissaray。

所以我的问题是,有没有办法解决这个问题?

由于

4 个答案:

答案 0 :(得分:3)

这里有两个问号:

?p=bid?Sale_ID=$Sale_ID

多个查询字符串参数由&符号分隔:

?p=bid&Sale_ID=$Sale_ID

答案 1 :(得分:1)

您显示的查询字符串:?p=bid?Sale_ID=$Sale_ID无效。带字符串的URL结构为:

filename.extension?first_parameter=first_value&second_parameter=second_value

因此,如果您希望p指明哪个页面:

?p=bid&Sale_ID=$Sale_ID

..使用&符号(&)分隔查询字符串值。

另外,请注意您用于包含文件的方法是不安全的。如果我寄这个怎么办:

?p=../../.htpasswd&Sale_ID=0

攻击者可以使用此方法输出您不希望向公众公开的文件内容。确保在盲目处理之前更仔细地检查此变量的值,包括文件。

我还想警告您不要使用错误抑制器(@)。错误是你的朋友!您想要确切知道代码中发生了什么,使用错误抑制器可以防止引起您注意的关键问题。真的 - 从来没有使用过误差抑制器。而不是@include,请使用include

我建议更像这样的事情:

$file_exists = false;
$page = false;
if (
    isset($_GET['p']) && 
    strlen(trim($_GET['p'])) > 0
){
    $page = preg_replace("/[^a-zA-Z0-9 ]/", "", $_GET['p']);
    $page = str_replace(" ", "-", $page);

    $file_exists = file_exists('include/'.$page.'.php');

    if ($file_exists) {
        include ('include/'.$page.'.php');
    } else {
        $page = false;
        echo 'Page you are requesting doesn´t exist<br><br>';
    }
}
if (!$file_exists ||$page === false)
    include ('include/login-form.php');

代码的第一部分确保查询字符串值存在并具有一些内容。然后它清除任何非字母数字字符(这有助于防止利用)。然后,我们检查它是否存在,将结果存储在变量中,以便我们可以再次使用它。

如果页面存在,则包含该文件。如果不是,则输出“找不到页面”消息,并包括登录表单文件。如果查询字符串中未指定页面,则包含登录表单文件。

<强>文档

答案 2 :(得分:0)

?p = bid“重定向”到您的默认文件,通常是index.php。您希望它在bid.php中有效。

您可以在apache中设置默认文件: DirectoryIndex index.php bid.php

另一个问题是你使用多个?迹象。

?p=bid&Sale_ID=$Sale_ID可以更好地运作

答案 3 :(得分:0)

请记住,file_exists不使用包含路径,因此您应该这样做:

if (file_exists( get_include_path() . 'include/'.$p.'.php')) {

更多信息: http://ca2.php.net/manual/en/function.file-exists.php