PHP Включение файла на основе pathinfo - проблема безопасности?

Я перенаправляю все запросы страниц через файл с именем 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';
}

?>

person MrCarrot    schedule 17.07.2013    source источник


Ответы (1)


Чтобы быть на 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() правильным.

person calcinai    schedule 17.07.2013
comment
Вы правы - это не супер быстро, но это было больше, чтобы показать точку. Первое предложение моего ответа будет моим рекомендуемым решением. Если бы glob использовался в производстве, флаг GLOB_NOSORT был бы хорошей идеей для повышения производительности. - person calcinai; 19.07.2013
comment
Спасибо за ваш ответ, в прошлом я использовал своего рода белый список страниц, как было предложено, но в идеале я не хочу обновлять белый список каждый раз, когда создается новая страница/шаблон. - person MrCarrot; 24.07.2013