отдельный файл php как шаблон - угроза безопасности? - PullRequest
4 голосов
/ 22 декабря 2009

Я искал системы шаблонов для php, и я пришел к выводу, что чистый php-код, кажется, является решением, которое я хочу использовать.

Я - одинокий разработчик, так что нет дизайнеров, которым нужна бывающая арена для работы. Механизмы шаблонов, такие как smarty, похоже, страдают от "эффекта внутренней платформы". Если я придерживаюсь хороших практик (предварительно вычисленные значения, используйте только foreach), я думаю, что это сработает.

Моя цель состоит в том, чтобы иметь единый источник для строки html, совместно используемой каждой страницей. Я думаю, что отдельный php-файл, доступ к которому осуществляется через include, является хорошим способом достижения этой цели.

Тем не менее, я обеспокоен тем, что это может создать угрозу безопасности для сайта - в настоящий момент я не могу придумать ничего конкретного, но кто-то может угадать название шаблона и запросить его напрямую, возможно, разоблачая что-то им не нужно видеть. (Я полагаю, я мог бы поставить проверку, чтобы убедиться, что это само по себе является запросом.) У меня есть предчувствие, что это может быть плохо, поэтому я не хочу идти дальше и делать это, создавать то, чего я боялся, произойдет, а затем выбросить эту работу.

Если отдельный файл не самая лучшая идея, что еще мне следует использовать для хранения строки для всего сайта? Строковая константа во включении, которую я мог бы использовать в sprintf ()? Функция, которая возвращает html-строку из аргументов html-частей, специфичных для страницы?

Ответы [ 4 ]

9 голосов
/ 22 декабря 2009

Файлы, которые не должны обслуживаться через HTTP, должны храниться в каталоге, из которого ваш веб-сервер не разрешает пользователям (по крайней мере, PHP) пользователям.

Две возможности:

  • поместите эти файлы за пределы DocumentRoot
  • или поместите эти файлы в подкаталог, из которого Apache не сможет обслуживать какой-либо файл.

Такие "не обслуживаемые" файлы обычно включают в себя такие вещи, как:

  • файлы конфигурации
  • библиотеки / фреймворки
  • файлы данных (например, база данных SQLite; или файлы i18n)


Первое решение: ваши каталоги могут выглядеть так:

  • data/
    • i18n/
    • i18n/your-file-here.php
  • library/
  • www/ <- это Apache DocumentRoot </strong> index.php
  • another-php-file.php


А для второго решения просто отключите доступ к каталогу, содержащему ваши файлы «данных» или «библиотеки», поместив в него файл .htaccess (если ваш веб-сервер Apache) , содержащий что-то вроде

Deny From All

При этом Apache не позволит никому напрямую получить доступ через HTTP к файлам в этом каталоге, но ваш исполняемый скрипт PHP (в другом каталоге) все равно сможет включать их.

4 голосов
/ 23 декабря 2009

Просто, правда; Назовите файл как хотите, но используйте «.inc.php» в качестве расширения, затем включите эту строку вверху файла:

if (basename(__FILE__) == basename($_SERVER['SCRIPT_FILENAME'])) {
    die;
}

это убьет скрипт, если к файлу обращаются напрямую.

РЕДАКТИРОВАТЬ: решение Паскаля Мартина, вероятно, больше соответствует BCP, в то время как мое решение более быстрое и грязное. Я использовал оба, и любой, кажется, в порядке.

1 голос
/ 23 декабря 2009

Мне также нравится использовать отдельный файл шаблона. Обычно я определяю константу в моем конфигурационном файле, а затем помещаю проверку на эту константу в верхней части включаемого файла, например:

Установить константу в конфигурации:

define('_VALIDPAGE', true);

Проверка константы во включенном файле:

defined('_VALIDPAGE') or die('Not allowed');

Это позволяет загружать включенный файл только из вашего приложения.

0 голосов
/ 23 декабря 2009

вы правы в том, что php сам по себе является прекрасной системой шаблонов, если вы придерживаетесь определенного подмножества в файлах-шаблонах. но настаивать на одном шаблоне для каждой веб-страницы нецелесообразно: чаще всего вы обнаружите, что у вас есть фрагменты, дублированные в нескольких шаблонах.

в любом случае, отдельные файлы в порядке. размещение шаблонов в каталоге (дереве), отдельном от исходного каталога (дерева), по моему мнению, плохая идея: концептуальное расстояние увеличивается, вы теряете представление о том, что действительно используется, а что нет, и в результате у вас немало шаблонов которые мертвы, но не похоронены, так как их состояние не так очевидно.

мое предложение: храните «шаблоны» вместе с «программными» файлами, защищенными соответствующей конфигурацией веб-сервера

DocumentRoot /www
AddType application/x-httpd-php .php

<Files ~ \.tpl$>
 deny from all
</Files>

/www/
  dir1/
    file.php
    file.tpl
    another-file.tpl
  dir2/
    other-file.php
    other-file.tpl
    yet-another-file.tpl
  ...
  common/
    shared-file.tpl
    another.tpl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...