【问题标题】:PHP include from URL variable going wrongPHP 包含来自 URL 变量的错误
【发布时间】:2012-09-11 08:37:12
【问题描述】:

在我正在构建的页面上,我要求它根据 URL 末尾的变量将文件加载到页面的一部分中。例如,如果页面 URL 是 test.php?page=lp 那么页面将包含文件 lp.php ......现在这工作了一段时间,但突然停止了,我只是好像文件不存在一样返回错误。然后我对脚本进行了“美化”,这样如果文件“未找到”,则会显示一条消息,如下所示:

<?php $times = substr_count($_SERVER['PHP_SELF'],"/");
$rootaccess = "";
$i = 1;

while ($i < $times) {
 $rootaccess .= "../";
 $i++;
}
$y = date("Y");
$ymo = $y-1;

//$rootaccess.
if(!file_exists($page.".php")){
echo "The file requested (www.websitename.co.uk$rootaccess$page.php) was not found, or an error occured";

}
else {include($rootaccess.$page.".php");} ?>    

所有发生的事情都是如果找不到文件就会被抛出......所以对于 test.php?page=lp 的示例,返回消息“请求的文件 (www.websitename.co. uk/lp.php) 未找到,或发生错误”。但事情是这样的,文件就在那里,因为页面也使用 AJAX,如果我使用 AJAX 链接在完全相同的位置加载完全相同的文件,它就可以工作! (同样,如果我在错误中输入地址显示,它会起作用)我使用 GET 来让脚本确定 $page 是否已设置,因为这也会更改页面的其他元素,所以我知道这是有效的。 ..但由于某种原因它不再想要包含该文件 - 那么解决方法是什么? (我也尝试过没有rootaccess位,但仍然失败) 谢谢。 (另外,如果有人对为什么 include($rootaccess.$page.".php") 会在一天工作然后在下一天停止工作有任何想法,那么我很想知道,因为目前我只是对着页面大喊让它工作!!!)

【问题讨论】:

  • 我打赌你的主机曾经打开过register_globals,所以你可以直接作为全局访问$page。请改用$_GET['page']。但请注意,除非您根据../ 之类的字符串值对其进行过滤,否则您很容易受到目录遍历攻击,可能会将文件系统上的任何可读文件暴露给网络。

标签: php variables if-statement include urlvariables


【解决方案1】:

我想我以前也遇到过同样的问题。尝试使用:

$foo = trim($page.".php");

if(!file_exists($foo)) {
     :
} else {
     include(trim($rootaccess.$foo));
}

【讨论】:

  • 这似乎行得通。我仍然在页面刷新时遇到错误,但这可能与 AJAX 发生了一些奇怪的冲突......只要禁用 JS 的人可以加载文件,我就很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2013-05-02
  • 2013-04-09
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多