我通过一个名为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';
}
?>
为了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()行为正确。