我正在尝试获取链接:
<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。
所以我的问题是,有没有办法解决这个问题?
由于
答案 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');
代码的第一部分确保查询字符串值存在并具有一些内容。然后它清除任何非字母数字字符(这有助于防止利用)。然后,我们检查它是否存在,将结果存储在变量中,以便我们可以再次使用它。
如果页面存在,则包含该文件。如果不是,则输出“找不到页面”消息,并包括登录表单文件。如果查询字符串中未指定页面,则包含登录表单文件。
<强>文档强>
$_GET
- http://php.net/manual/en/reserved.variables.get.php include
和$_GET
- http://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/ preg_replace
- http://php.net/manual/en/function.preg-replace.php str_replace
- http://php.net/manual/en/function.str-replace.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')) {