2010-07-16 4 views
2

У меня есть определенные файлы, такие как header.php и footer.php. Я хотел бы отключить эти файлы от прямого запроса в адресной строке браузера.Есть ли способ предотвратить запрос файла .php?

Если у меня есть код include 'file.php' в коде, тогда он должен быть включен, но если у вас есть прямой запрос, я не хочу, чтобы он показывался, так как он не предназначен для целей. Является ли это возможным?

Заранее спасибо :)

+1

Вы можете использовать 'требуют()' вместо 'включают()' : require() выдает ошибку, если файл не существует, в то время как include() будет только поднимать предупреждение – Piskvor

+0

@Piskvor Спасибо – TCM

ответ

9

Вы можете сделать любой из этих вещей, в порядке желательности (от «хорошо» до «это вид работ»):

  • Создать их за пределами вашей сети корень. Например, если предположить, что /somepath/example.com/htdocs/ сопоставляется http://example.com/:

/somepath/example.com/htdocs/index.php
/somepath/example.com/includes/header.php
/somepath/example.com/includes/footer.php

index.php:

<?php require_once('../includes/header.php') ?> 
  • доступ Предотвращение через .htaccess

<Files (header|footer).php>
Deny from all
</Files>

  • (хак, если все остальное терпит неудачу) установить константу в главном файле, умирают молча, если не найден.

index.php:

<?php define('INCLUDED_FROM_MAIN_FILE_EXAMPLE_COM',true) ?>

header.php:

<?php if (!defined('INCLUDED_FROM_MAIN_FILE_EXAMPLE_COM')) { die(); }

+0

несколько полезных параметров +1 – thetaiko

+2

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

+1

Я бы не пошел по пути относительных путей, учитывая переносимость кода, но включил директиву в конфигурацию веб-сервера вроде (для apache) 'php_admin_value include_path" /home/example.com/www/includes "' с документом root на '/ home/example.com/www/pages' или что-то в этом роде. Внутри '/ includes /' вы также можете создавать каталоги, а затем включать «common/init.php». – mvds

0

Почему о переименовании их как header.php.inc? И затем установка

<Files *.inc> 
    Order allow,deny 
    Deny from all 
</Files *.inc> 

Я думаю, что это довольно стандарт.

+0

Это не мешает работе файла. Но это, вероятно, не позволяет его разобрать, что означает, что вы покажете пользователю код PHP. В зависимости от сайта, это может стать огромным риском для безопасности. - Не обращайте внимания - код .htaccess был добавлен после того, как я написал это. –

+0

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

2

Общим способом предотвращения этого является создание определения в index.php (или как вы его называете) и проверка этого определения.

Таким образом, вы получите что-то подобное в вашем index.php

define('USING_INCLUDE', 1); 

И это в вашем footer.php:

if(!defined('USING_INCLUDE')){ 
    header('HTTP/1.1 403 Forbidden'); 
    die(); 
} 
+3

Я бы сделал это с большим удовольствием. Но я бы не только назвал 'die()', но также http-заголовок 403 (доступ запрещен). –

+0

True faileN, я изменил его :) – Wolph

Смежные вопросы