защита php включает (с htaccess?)

Прежде всего, я уверен, что подобный вопрос будет рассмотрен в разделе «Переполнение стека», но я его действительно не нашел. Возможно, потому, что я использую неправильные ключевые слова. Так что не стреляйте в меня из-за этого.

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

Например, у меня есть каталог include с файлом php, который содержит мое соединение с БД (пароль и т. Д. Опасно?). Я хочу включить его, но я не хочу, чтобы люди сразу посещали страницу.

Будет ли пароль в каталоге include с htaccess исправить мою проблему? Сначала я подумал, что это не так, потому что было бы странно, что страницы могут быть включены для пользователей, которые не имеют к нему доступа. Но, похоже, это работает, как это происходит? Есть ли другой лучший вариант? Что обычно делают веб-разработчики?

А также могу ли я сделать что-то подобное для файлов javascript? Я предполагаю, что это не так, но я просто спрашиваю. Файл js содержит ajax-вызовы на определенные страницы, но, я думаю, я доволен, если могу защитить страницы php от посещения.

В любом случае спасибо заранее 🙂

Related of "защита php включает (с htaccess?)"

Я думаю, что объяснение того, как работают произведения, поможет устранить путаницу.

Запрос приходит (из веб-браузера пользователя). Ваш веб-сервер (в этом примере, 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 в свой корень документа вообще.
  • Вы не можете сделать это для JavaScript, поскольку доступ к JavaScript проходит через Apache (так же, как .html, .png и т. Д.).

В идеале, ваши 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/