在php中包含基于查询字符串值的文件是否安全?

时间:2011-11-27 19:57:03

标签: php security

我正在尝试动态包含一些文件,我需要从查询字符串中获取一些参数。这是脚本的一部分,为我提供了诀窍:

require_once ROOT . "/components/{$_GET['c']}/" . str_replace('_', '/', $classname) . '.php';

包含这样的文件是否安全?

4 个答案:

答案 0 :(得分:4)

没有!这绝不是安全的。始终消毒来自外部世界的输入。您可以使用数组执行此操作:

$allowed = array(
  'page1',
  'page2'
);

现在检查数组中是否有$_GET['c']并包含您的文件。

if(in_array($_GET['c'], $allowed)) {
  $dir = $_GET['c'];
  require_once ROOT . "/components/{$dir}". str_replace('_', '/', $classname);
}

答案 1 :(得分:2)

不,永远不会。来自外部的 Everything 必须首先被视为“恶意”。这意味着,您必须在使用前验证所有内容

例如

$c = $_GET['c'];
if (in_array($c, $listOfValidFolders) {
  require_once ROOT . "/components/$c/" . str_replace('_', '/', $classname);
}

答案 2 :(得分:1)

不,因为如果您有该目录中的任何文件。您应该有一个已接受值的列表,并检查所请求的页面是否在其中。

答案 3 :(得分:1)

没有。先检查一下。更好的是,可以包含可以包含的文件白名单。还有别的,发送404 Not Found回复。