0

我通过一个名为 index.php 的文件重定向所有页面请求,该文件查看访问者请求的 URL 并查看是否有模板文件匹配。

例如,http://www.website.com/contact将实际路由到 index.php 脚本,并应检查文件 /var/html/template/contact.tpl 是否存在,如果存在则包含它。

我关心的是安全性和空字符、多余的点和斜杠等。是否需要对下面的代码应用任何类型的过滤器,或者使用 pathinfo 和目录前缀是否足够?显然我不希望任何人能够恶意包含指定模板目录之外的文件。

<?php

define ('TEMPLATES', '/var/html/templates');

$page = pathinfo ($_SERVER['REQUEST_URI'], PATHINFO_FILENAME);

if (file_exists (TEMPLATES . '/' . $page . '.tpl')) {
    include (TEMPLATES . '/' . $page . '.tpl');
} else {
    header ('HTTP/1.0 404 Not Found');
    echo 'Sorry page not found';
}

?>
4

1 回答 1

3

为了 100% 安全,请列出允许的页面并在返回页面之前检查它是否在该数组中。

您甚至可以尝试使用 php,glob()例如。

define ('TEMPLATES', '/var/html/templates/');

$page = TEMPLATES . pathinfo($_SERVER['REQUEST_URI'], PATHINFO_FILENAME) . '.tpl';

if (in_array($page, glob(TEMPLATES . '*.tpl'))) {
    include ($page);
} else {
    header ('HTTP/1.0 404 Not Found');
    echo 'Sorry page not found';
}

这将验证它是否在该文件夹中并且扩展名是“.tpl”

抱歉 - 刚刚编辑以使 glob() 行为正确。

于 2013-07-17T23:40:02.670 回答