Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP包含基于pathinfo的文件-安全问题?_Php_Security_Sanitize_Pathinfo - Fatal编程技术网

PHP包含基于pathinfo的文件-安全问题?

PHP包含基于pathinfo的文件-安全问题?,php,security,sanitize,pathinfo,Php,Security,Sanitize,Pathinfo,我通过一个名为index.php的文件重定向所有页面请求,该文件查看访问者请求的URL,并查看是否有模板文件匹配 例如,将实际路由到index.php脚本,并应检查文件/var/html/template/contact.tpl是否存在,如果存在,则将其包括在内 我关心的是安全性和空字符、额外的点和斜杠等。是否需要对下面的代码应用任何类型的过滤器,或者使用pathinfo和目录前缀就足够了?显然,我不希望任何人能够恶意包含指定模板目录之外的文件 <?php define ('TEMPLA

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

例如,将实际路由到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()行为正确。

为了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()行为正确而进行了编辑。

你说得对-它不是非常快,但更能说明问题。我回答的第一句话是我推荐的解决方案。如果在生产中使用glob,则使用
glob\u NOSORT
标志将是一个提高性能的好主意。感谢您的回答,过去我使用了一种建议的“白名单”页面,但理想情况下,我不想每次创建新页面/模板时都要更新白名单。你说得对——这不是很快,但更能说明问题。我回答的第一句话是我推荐的解决方案。如果在生产中使用glob,则使用
glob\u NOSORT
标志将是一个提高性能的好主意。感谢您的回答,在过去,我按照建议使用了一种页面“白名单”,但理想情况下,我不希望每次创建新页面/模板时都要更新白名单