文件存在安全吗?

时间:2009-08-27 16:22:46

标签: php security

if (file_exists("pages/$page.php")) {
  include($page.'.php');
}

这样安全吗?

使用Safe我的意思是你不能包含远程脚本等

6 个答案:

答案 0 :(得分:7)

当然不是,尤其是$page = "./configuration"

我建议用这样的东西替换它:

$pages = array("blog", "home", "login");
if (in_array(strtolower($page), $pages))
  include("pages/$page.php");

编辑:您可以使用此代码生成可接受网页的列表。

$pages = array();
if ($dh = opendir("pages")) {
  while (($file = readdir($dh)) !== false) {
    if (strstr($file, ".php") !== false) // make sure it is a .php file
      $pages[] = substr($file, -4); // remove the .php
  }
  closedir($dh);
}

答案 1 :(得分:2)

你发布的代码有一个错字我相信。它应该是:

if (file_exists("pages/$page.php")) {
  include("pages/$page.php");
}

然而,如果PHP设置允许,它会导致代码注入,包含远程文件。

您需要确保您包含的页面不能是任意页面。

通常你会在使用Factory方法的“Loader”类中看到这种类型的代码,但是,在良好的实现中,它会限制它将加载到某个目录或某个预定义文件集的文件和类。 。

答案 2 :(得分:1)

如果从未设置$ page,PHP将尝试在php.ini中的variables_order指令后面找到它。该指令告诉PHP查找变量的顺序。由于此默认值为EGPCS,因此狡猾的黑客会调用您的脚本并告诉它包含PHP也可以访问的任何文件。

例如:

www.example.com/?page=dbConfig.ini

答案 3 :(得分:1)

将所有可能的页面名称存储在数组中是最安全的方法,但只需验证提供的页面名称并确保页面目录中没有任何“危险”文件,您也可以相当安全。

$page = basename($_GET['page']);
if (file_exists("pages/$page")) {
  include("pages/$page");
} else {
  include("pages/default.php");
}

答案 4 :(得分:1)

使用basename($ _ REQUEST ['page'])来阻止对其他目录的潜在访问,然后检查它是否存在。

http://php.mirror.facebook.net/manual/en/function.basename.php

答案 5 :(得分:0)

正如ceejayoz在bucabay的回答中所评论的那样,所请求的页面可能有“../”,这使得用户可以轻松地突破它们的位置。我对另一个问题的回答应该对你有用。

https://stackoverflow.com/a/12361051/1524693

如果链接死亡:基本上你检查include目录和所请求文件的realpath(),如果文件的realpath()以include目录的realpath()开头,则可以安全地包含。 (我使用strpos()== 0检查文件路径是否以包含路径开头)