0

我目前正在尝试获取链接:

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

工作,但我不断收到“您请求的页面不存在”消息,如果我使用此链接,此页面有效:

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

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

  <?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');
  }
  ?>

我尝试添加另一个 isset 用 q 替换 p ,这只会让我的页面陷入混乱。

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

谢谢

4

4 回答 4

3

这里有两个问号:

?p=bid?Sale_ID=$Sale_ID

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

?p=bid&Sale_ID=$Sale_ID

于 2012-08-16T18:06:23.827 回答
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');

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

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

文档

于 2012-08-16T18:07:50.163 回答
0

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

您可以使用以下命令在 apache 中设置默认文件: DirectoryIndex index.php bid.php

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

?p=bid&Sale_ID=$Sale_ID会工作得更好

于 2012-08-16T18:05:21.770 回答
0

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

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

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

于 2012-08-16T18:07:17.607 回答