Действительно ли в PHP необходимо «не загружать эту страницу напрямую»? - PullRequest
1 голос
/ 20 сентября 2008

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

Ответы [ 8 ]

8 голосов
/ 21 сентября 2008

Причина, по которой это чаще встречается в PHP, чем другие подобные языки, связана с историей PHP. В ранних версиях PHP по умолчанию был установлен параметр register_globals (на самом деле, он может даже не быть настройкой в ​​действительно ранних версиях). Register_globals говорит PHP определять глобальные переменные в соответствии со строкой запроса. Так что если вы запросили такой скрипт таким образом:

http://site.com/script.php?hello=world&foo=bar

... скрипт автоматически определит переменную $ hello со значением «world» и $ foo со значением «bar».

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

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

Лично я избегаю всего этого, используя платформу Symfony, которая (по крайней мере, в его настройке по умолчанию) вообще не допускает контроллеров и шаблонов из веб-корня. Единственной точкой входа является передний контроллер.

2 голосов
/ 21 сентября 2008

Если вы включаете все из внешнего корневого веб-узла, это не проблема, поскольку ничего не может быть загружено напрямую.

1 голос
/ 20 сентября 2008

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

Но если файл содержит только функции, то нет никакого вреда в пропуске проверки.

1 голос
/ 20 сентября 2008

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

Если, однако, ваш пользователь мог включить файл из собственного скрипта, это не поможет вообще

0 голосов
/ 19 февраля 2009

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

0 голосов
/ 21 сентября 2008

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

Кроме того, правильный способ сообщить пользователю о том, что страница не существует, - выдать статус 404, используя:

header("HTTP/1.0 404 Not Found");
exit;

Если вы этого не сделаете, не-людям (например, поисковым системам) будет отличить обычную страницу от не-страницы.

0 голосов
/ 20 сентября 2008

Я только что нашел подход в системе .Net MVC, который можно реплицировать для PHP с использованием переписанных файлов Apache, файлов .htaccess или, если вы используете IIS, файла web.config.

Поскольку шаблону MVC не нужен пользователь для прямого доступа к файлам aspx, они не обслуживаются, а вместо этого отправляется 404. Например, если у вас есть соглашение об именовании для включаемых файлов «inc.php», вы можете перенаправить запросы * .inc.php на 404 для определенных папок - в Apache Rewrite, поставив R = 404, в конце правила вернется этот HTTP-статус вашему клиенту.

Некоторые из этих примеров могут помочь: Примеры переписывания Apache

0 голосов
/ 20 сентября 2008

Это также не просто функция безопасности в php, а большая часть того, как много сайтов на основе MVC работают. Если, например, в SugarCRM вам нужно было вызвать файл модуля напрямую, загрузка страницы не удалась бы, потому что контроллер, представление и модель не были ранее загружены, и у вас также не было бы никакой информации о конфигурации / подключении БД, поэтому убедитесь, что все зависимости загружены. пользователи проходят через известную точку входа - т.е. index.php

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