Организация PHP включает в вашу среду разработки

Я проверяю дизайн своего сайта на основе превосходного Essential PHP Security Криса Шифлетта.

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

Сделать это на моем общем хосте достаточно просто, но мне интересно, как люди справляются с этим на своих тестовых стендах разработки?

В настоящее время у меня настроена установка XAMPP, так что localhost/mysite/ совпадает с D:\mysite\, в котором включения хранятся в D:\mysite\includes\

Думаю, мне нужно реплицировать путь сервера на мой локальный диск, чтобы обеспечить точность включенных путей? Что-то вроде D:\mysite\public_html\

Есть ли способ лучше?


person Drew    schedule 07.01.2011    source источник
comment
Я бы пошел с подходом public_html. Благодаря этому у вас также будет дом для ваших демонов и cronjobs (если они у вас есть). Т.е. d:\mysite\cronjobs   -  person Christian Joudrey    schedule 07.01.2011
comment
Часто бывает достаточно .htaccess отрицать типичный includes или classes каталог. Удаление их из корневого каталога документов - это в основном способ скрыть его, но все файлы остаются доступными по относительным путям. Часто более целесообразно перемещать каталоги данных. Запускайте потенциально небезопасные приложения через старый добрый mod_php, а не через suexec / fastcgi.   -  person mario    schedule 07.01.2011


Ответы (3)


Это кажется камнем преткновения для многих разработчиков php, поэтому давайте рассмотрим его как следует. Большинство приложений PHP засоряют свой код include '../../library/someclass.php.class'. Это никому не годится, потому что его очень легко сломать, и никому не нравится выполнять работу по уборке пути, когда вы должны писать код. Это также немного похоже на построение карточного домика и закрепление стыков из опасения каких-либо изменений. Итак, хорошо, может быть, мы могли бы просто создать константу и использовать полный путь?

define('PATH', '/home/me/webroot/Application');
include(PATH . '/Library/someclass.php.class');

Что ж, это неплохо, но что, если мы развернем в Windows? Кроме того, собираемся ли мы определять путь для каждой точки входа в скрипт? Не очень СУХОЕ, если вы спросите меня. Кроме того, перемещение развертываний будет огромной проблемой. Ясно, что пока мы ближе, это не особый прогресс.

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

Итак, давайте просто скажем, что у вас есть одна точка входа для вашего приложения или, по крайней мере, общий файл заголовка. Мы можем довольно быстро получить наш корень развертывания, если мы знаем, где наш заголовочный файл связан с корнем кода. IE, в /home/me/webroot/Application/Init/set_paths.php

define('PATH_SITE', realpath(dirname(__FILE__) . '/../../'));

Отлично, это корень нашего документа. Он не зависит от ОС, и его довольно легко адаптировать, если вы измените место проживания set_paths.php. Теперь мы можем поговорить о некоторых других местах в нашем приложении просто потому, что константы удобны:

define('PATH_APPLICATION', realpath(PATH_SITE . "/Application"));
define('PATH_LIBRARY', realpath(PATH_SITE . "/Application/Library"));
define('PATH_CONFIG', realpath(PATH_SITE . "/Config"));
define('PATH_WRITE', realpath(PATH_SITE . "/Volatile"));

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

$paths['inc'] = array_flip(explode(PATH_SEPARATOR, get_include_path()));
unset($paths['inc']['.']);
$paths['inc'] = array_flip($paths['inc']);

// The first item on the path the external
// libs that get used all the time,  
// then the application path, then the
// site path, and any php configured items.
// The current directory should be last.

$paths = array_merge(array(PATH_LIBRARY, PATH_APPLICATION, PATH_SITE), $paths['inc'], array("."));
set_include_path(implode(PATH_SEPARATOR, $paths));

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

include('someclass.php.class');

Еще один шаг

Если вы работаете с довольно хорошо разработанным ООП-приложением, мы можем пойти немного дальше. Если вы подписываетесь на один файл, один класс, тогда соглашение об именах PEAR делает жизнь очень простой.

Соглашения об именах PEAR диктуют соотношение 1: 1 между файловой системой и классом. Например, класс Foo_Bar_Baz можно найти в файле «Foo / Bar / Baz.php» на вашем include_path. источник

Когда у вас есть предсказуемое сопоставление файлов с классами, вы можете реализовать spl_autoload_register А можно заменить

include('someclass.php.class');
new SomeClass();

Просто

new SomeClass();

И пусть PHP с этим справится за вас.

person jhogendorn    schedule 07.01.2011

Да, есть способ получше. Вы всегда должны использовать относительные пути, как в include('./includes/foo.php');. Если ваши пути относительны, вам не нужно беспокоиться о локальных путях, за исключением того, что они должны соответствовать общей структуре сайта (./includes может относиться к D:\projects\web\foo-page\includes на вашем локальном компьютере и /home/andrew/foo-page/includes на сайте).

В качестве альтернативы используйте веб-сервер на вашем локальном компьютере или виртуальную машину, чтобы имитировать вашу производственную среду; в правильно настроенной среде / будет относиться к вашему wwwroot, а не к вашему корневому каталогу (например, файловая система / или D:\ в Windows).

person asthasr    schedule 07.01.2011

У вас всегда могут быть относительные пути включения. Либо просто выполните require ("../../ something"); вместо require ("D: \ something \ something"); (Конечно, в этом случае вы должны убедиться, что число .., прежде чем ваш путь правильный. (.. означает переход в родительский каталог)), или, если ваша структура включения очень сложна, вы можете использовать < strong> FILE, которая всегда указывает на исполняемый файл php. Вы можете получить это значение, а затем проанализировать необходимые пути к вашему файлу.

Наконец, если вы хотите сохранить структуру файлов как можно более точной, как на производственном сервере, но не хотите хранить много файлов в разных местах, поищите переходы http://en.wikipedia.org/wiki/NTFS_junction_point для Windows или символические ссылки для * nix. Таким образом, вы можете построить правильные пути, используя переходы, в то же время сохраняя исходные файлы там, где они были, таким образом, сохраняя только 1 версию файлов.

person Cray    schedule 07.01.2011