Прежде всего, я уверен, что подобный вопрос будет рассмотрен в разделе «Переполнение стека», но я его действительно не нашел. Возможно, потому, что я использую неправильные ключевые слова. Так что не стреляйте в меня из-за этого.
В чем заключается мой вопрос, я хочу включить php-файлы, но я хочу, чтобы они были включены, а не для того, чтобы люди открывались в своем браузере. Они должны получить сообщение об ошибке.
Например, у меня есть каталог include с файлом php, который содержит мое соединение с БД (пароль и т. Д. Опасно?). Я хочу включить его, но я не хочу, чтобы люди сразу посещали страницу.
Будет ли пароль в каталоге include с htaccess исправить мою проблему? Сначала я подумал, что это не так, потому что было бы странно, что страницы могут быть включены для пользователей, которые не имеют к нему доступа. Но, похоже, это работает, как это происходит? Есть ли другой лучший вариант? Что обычно делают веб-разработчики?
А также могу ли я сделать что-то подобное для файлов javascript? Я предполагаю, что это не так, но я просто спрашиваю. Файл js содержит ajax-вызовы на определенные страницы, но, я думаю, я доволен, если могу защитить страницы php от посещения.
В любом случае спасибо заранее 🙂
Я думаю, что объяснение того, как работают произведения, поможет устранить путаницу.
Запрос приходит (из веб-браузера пользователя). Ваш веб-сервер (в этом примере, Apache) получает это. Во-первых, он проверяет разрешения <Location>
. Затем он просматривает остальную часть конфигурации и в конечном итоге отображает URI запроса в файловую систему. Теперь, наконец, он может проверить разрешения <Directory>
а также .htaccess
.
Если какая-либо из этих проверок разрешений (например, отказ deny from all
), Apache прекращает обработку запроса и отправляет обратно ошибку (или запрашивает имя пользователя и пароль в случае базовой проверки подлинности HTTP).
Как только все проверки разрешений пройдут, Apache смотрит на файл и замечает, что это файл .php
. Где-то в вашем (или вашем веб-хосте) Apache config есть директива AddHandler
которая сообщает Apache передать этот запрос на PHP-движок (который может быть mod_php или через быстрый cgi). (Для большинства файлов вместо этого он отправляет содержимое файла в браузер, но файлы сценариев являются особенными из-за этого AddHandler
.)
Теперь PHP читает ваш файл сценария. Затем он также считывает ваши включенные файлы напрямую . Это не возвращается через Apache, поэтому такие вещи, как .htaccess
, не применяются. Это также означает, что ваш PHP- код не обязательно должен находиться в корне вашего документа. Они могут быть в любом месте, к которому может обращаться процесс PHP (на основе разрешений UNIX и конфигурации PHP). Установка include_dir в php.ini позволяет легко размещать их везде.
Клиентский JavaScript выполняется браузером пользователя. Он не интерпретируется на стороне сервера (например, PHP). Таким образом, пользователь должен иметь доступ к нему, точно так же, как пользователь должен иметь доступ к вашим .html-файлам.
Итак, одним словом:
.htaccess
с Deny from all
в ваши PHP включенные каталоги. Директива include
PHP не проходит через Apache, поэтому это не волнует. В идеале вы даже не помещаете свои каталоги включений PHP в свой корень документа вообще. В идеале, ваши PHP-файлы должны находиться в папке, недоступной для Интернета.
например: скажите, что ваш веб-сайт находится в /var/www/htdocs/
, тогда вы должны поместить туда index.php
, но /var/www/htdocs/
должны быть в отдельной папке за пределами доступной в Интернете области. В этом примере у вас может быть папка вместе с htdocs
называемая как /var/www/includes/
, где будет включен PHP.
Таким образом, они полностью защищены от нежелательного прямого доступа к сети.
Кроме того, вы должны написать свой PHP-код, чтобы включенный файл содержал только классы или функции. Это означает, что если он каким-либо образом осуществляется из Интернета, ничего не произойдет: PHP будет загружать все функции, но не будет запускать их, поэтому пользователь просто увидит пустую страницу.
Если другая страница хочет включить этот файл, ему нужно будет включить include, а затем также вызвать функцию (ы) внутри него; вы не должны включать include, который запускает код немедленно.
Вы должны писать только PHP-код, который запускается сразу на страницах, предназначенных для прямого доступа пользователей, например index.php
.
Надеюсь, это поможет.
Создайте файл .htaccess в своем каталоге include
deny from all
Нельзя выполнить для клиентских сценариев, поскольку браузер должен иметь к ним доступ. Лучшее, что вы можете сделать, это запутать их .
У вас есть возможность сделать это, не используя .htaccess (не говоря, что это лучшее решение, просто другое).
В файлах, которые вы хотите, чтобы пользователь имел доступ напрямую, поставьте следующее:
@define('IN_APPLICATION', true); require 'file.class.php'; //sample include
Затем в include (файлы классов) поместите следующий код справа вверху:
if (!defined('IN_APPLICATION')){ die(header('HTTP/1.0 404 Not Found')); //or just die(); }
Это гарантирует, что файлы классов доступны только в том случае, если они включены в файл (front end), который определяет IN_APPLICATION
. Вы могли бы просто просто убить файл класса с помощью die()
самостоятельно, а не подделывать 404.
Хм, как уже упоминалось, htaccess не будет препятствовать доступу php к защищенным папкам htpassword. Следовательно, Apache необходимо вызвать, чтобы использовать его защищенные функции, которые достаточно безопасны, по крайней мере, с помощью https IMHO, например:
header('Location: secret/index.php');
Если секрет папки защищен htaccess.
index.php может выглядеть так:
<?php $a = $_REQUEST['a'] ; if ($a==secret) header('Location: secret/index.php'); include_once("index_head.php"); include_once("index_tail.php"); ?>
И secret / index.php
<?php include_once("../index_head.php"); include_once("./secret.php"); include_once("../index_tail.php"); ?>
Основная оставшаяся проблема заключается в том, что secret / index.php не найдет ссылок, например ./main.css и т. Д. Поэтому ссылки должны быть определены как абсолютные, а не относительные, но я уверен, что вы, ребята, сейчас, как это сделать; )
Пример работы находится на http://promotio.ch/secret.php/