1

这包括安全吗?或者是否可以使用一些 RFI/LFI 或它叫什么?

$request_uri = explode('/', $_SERVER['REQUEST_URI']);
$script_name = explode('/', $_SERVER['SCRIPT_NAME']);

for ($i = 0; $i < sizeof($script_name); $i++) {
    if ($request_uri[$i] == $script_name[$i])
    {
        unset($request_uri[$i]);
    }
}

$command = array_values($request_uri);

if (file_exists('controllers/' . $command[0] . '.php')) {
    include 'controllers/' . $command[0] . '.php';
}

更新:

if (isset($_GET['p'])) {
    $pages = array('home', 'login', 'register');
    $page = filter_var($_GET['p'], FILTER_SANITIZE_URL);

    if (in_array($page, $pages) && file_exists($page . '.php')) {
        include ($page . '.php');
    } else {
        include ('404.php');
    }  
}
else {
    include ('home.php');
}
4

2 回答 2

1

好吧,如果你确保$command[0]它只包含字母数字字符(可能还有下划线和连字符),那可能会有点安全。

像下面这样的东西可能会完成这项工作:

if (!ctype_alnum($command[0])) {
    // Hacking attempt!
    exit;
}

但是根据用户输入包含文件仍然是一个坏主意。更好的想法是使用将 URI 映射到控制器的查找表,并使用自动加载来包含相关文件。这样,用户输入和包含之间就有了很大的区别。

于 2012-05-05T17:47:25.427 回答
0

您的代码将用户提供的任意字符串提供给 PHP 的include; 这很糟糕,几乎是https://www.owasp.org/index.php/Server-Side_Includes_(SSI)_Injection的教科书示例

你想解决什么问题需要这个?

于 2012-05-05T17:34:02.280 回答