Организация PHP включает в вашу среду разработки - PullRequest
4 голосов
/ 07 января 2011

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

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 07 января 2011

Это кажется камнем преткновения для многих разработчиков 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 разберется с вами.

4 голосов
/ 07 января 2011

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

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

1 голос
/ 07 января 2011

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

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

...