我正在尝试动态包含一些文件,我需要从查询字符串中获取一些参数。这是脚本的一部分,为我提供了诀窍:
require_once ROOT . "/components/{$_GET['c']}/" . str_replace('_', '/', $classname) . '.php';
包含这样的文件是否安全?
答案 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
回复。