PHP: Проверьте, загружается ли файл непосредственно вместо включения?

Существует ли способ предотвратить пользователя, просматривающего файл, но все еще использовать его, как включено в другой файл в PHP?

33
задан Peter Mortensen 3 November 2012 в 17:01
поделиться

7 ответов

Если вы используете

define('APP_RAN'); 

в файле, который включает его, а затем помещаете

if(!defined('APP_RAN')){ die(); }

или альтернативно

defined('APP_RAN') or die();

(что проще для чтения)

во включаемые файлы, то при прямом обращении к ним он погибнет.


Хотя, вероятно, лучше было бы поместить все включаемые файлы выше корня DocumentRoot.

Например, если ваша индексная страница находится по адресу

/my/server/domain/public_html

Вы должны поместить включаемые файлы в

/my/server/domain/
52
ответ дан 27 November 2019 в 17:30
поделиться

Вы должны использовать расширение PHP для кодировщика и загрузчика:

Коммерческий

Free

-7
ответ дан 27 November 2019 в 17:30
поделиться

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

14
ответ дан 27 November 2019 в 17:30
поделиться

Просто храните файл вне корня сайта.

10
ответ дан 27 November 2019 в 17:30
поделиться

В Apache это просто: добавьте директиву в .htaccess, чтобы предотвратить доступ к нему из веб-браузера. Это не относится к PHP includes, и это хорошая практика - скрывать несколько файлов от доступа браузера (хотя обычно вы стараетесь поместить все недоступные файлы в один каталог).

<Files="myprivatefile.php">
    deny from all
</Files>

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

2
ответ дан 27 November 2019 в 17:30
поделиться

Я бы выбрал решение Chacha102 .

Кроме того, поскольку в заголовке вашего вопроса написано « как проверить », вы также можете сделать это без необходимости определять переменную, используя

// secret.php is the name of this file.
if($_SERVER["SCRIPT_FILENAME"]=='secret.php') die();
0
ответ дан 27 November 2019 в 17:30
поделиться

Если вы хотите, чтобы он никогда не отображался, если он не включен, вот более автоматический способ.

if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])) header("HTTP/1.0 404 Not Found");

Таким образом, он все равно будет работать, если вы в конечном итоге измените имя файла или что-то в этом роде.

1
ответ дан 27 November 2019 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: