Последствия для безопасности при написании файлов с использованием PHP - PullRequest
5 голосов
/ 15 апреля 2010

В настоящее время я пытаюсь создать CMS с использованием PHP, исключительно в интересах образования. Я хочу, чтобы администраторы могли создавать контент, который будет анализироваться и сохраняться в хранилище сервера в чистом виде HTML, чтобы избежать накладных расходов, связанных с выполнением сценария PHP. К сожалению, я мог придумать только несколько способов сделать это:

  • Установка разрешения на запись для каждого каталога, где CMS должна захотеть записать файл. Это звучит как довольно плохая идея.
  • Установка разрешений на запись в один каталог cached. Сценарий PHP может затем include или fopen/fread/echo содержимое файла в каталоге cached во время запроса. Возможно, это можно сделать в стиле Mediawiki: что-то вроде index.php?page=xyz может читать и выводить контент из cached/xyz.html во время выполнения. Однако мне нужно обеспечить разумность $_GET['page'], чтобы предотвратить такие неприятные изменения, как index.php?page=http://www.bad-site.org/malicious-script.js.

Лично я не слишком взволнован второй идеей, но первая звучит очень небезопасно. Может кто-нибудь предложить хороший способ сделать это?

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

Ответы [ 3 ]

2 голосов
/ 15 апреля 2010

Поскольку вы создаете CMS, вам придется признать, что если пользователь хочет делать злые вещи посетителям, он, скорее всего, может. Это верно независимо от того, где вы храните свой контент.

Если на общедоступном сайте все статическое содержимое, нет ничего плохого в том, чтобы позволить CMS писать файлы напрямую. Однако вы должны настроить веб-сервер так, чтобы он не выполнял никаких действий в любом каталоге, доступном для записи CMS.

Даже если вы не хотите каждый раз обращаться к базе данных, вы можете настроить кэш, чтобы минимизировать чтение базы данных. Zend_Cache отлично подходит для этого и может использоваться довольно эффективно в качестве автономного компонента.

1 голос
/ 15 апреля 2010

Вы должны поместить свои страницы в базу данных и получить их с помощью параметризованных запросов SQL.

0 голосов
/ 15 апреля 2010

Я бы выбрал второй вариант, но изменил бы его так, чтобы файлы извлекались с использованием mod_rewrite, а не пользовательской функции php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...