Безопасность PHP - Структура каталогов сайта - PullRequest
0 голосов
/ 04 апреля 2011

Итак, у меня довольно нубистский вопрос, я много читал по этому вопросу, но не могу найти ответ, который хочу, поэтому терпите меня ...

У меня довольнопростой веб-сайт, который я проектировал, состоящий из следующих элементов:

1) HTML и PHP-файлы, к которым я хочу, чтобы пользователь мог получить прямой доступ, введя URL-адрес в браузере.

2) HTML-файлы, которые должны просматриваться только внутри iframe в 1) (не спрашивайте меня, почему я использовал iframes)

3) PHP-файлы, которые вызываются 1), например, когда данные формыпредставленЯ хочу, чтобы 2) и 3) были доступны для 1), но не доступны непосредственно для пользователя путем ввода URL-адреса.

4) изображений и включений и т. Д.

5) возможноэто совсем другая проблема, но у меня также есть база данных MySQL.

Я понимаю, что могу контролировать доступ к файлам, помещая их в частные / общие папки в каталоге веб-сайта?Мой вопрос заключается в том, как должна быть моя структура каталогов и куда я должен поместить 1), 2), 3) и т. Д.? * 10101

Большое спасибо за вашу помощь.

Ответы [ 5 ]

1 голос
/ 04 апреля 2011

Ваша структура каталогов не имеет значения. Любой URL-адрес, доступный некоторым пользователям, доступен всем пользователям. У вас есть только контроль над контентом этого URL.

Если вам действительно нужно ограничить доступ к контенту, загруженному 1), вы должны использовать PHP для обслуживания контента. Этот PHP-скрипт может проверять некоторые параметры или учетные данные для входа или что-то, что гарантирует, что URL был загружен 1).

Однако трудно дать вам четкий ответ, поскольку вы не описываете конкретную проблему, с которой вы столкнулись. Например, очень важно, насколько безопасным должен быть метод. Например, довольно просто проверить, загружен ли URL-адрес внутри фрейма с помощью JavaScript, но эту проверку несложно обойти.

1 голос
/ 04 апреля 2011

Ваш каталог httpdocs - это ваш Apache DocumentRoot (находится в /etc/httpd/conf/httpd.conf) или ваш vhost DocumentRoot (если вы определили vhosts), поэтому для Linux:

1,2, 4 должен идти в /var/www/vhosts/sitename.com/httpdocs/ - они доступны через браузер.

3 должен идти в /var/www/vhosts/sitename.com/library/.Когда пользователь отправляет данные, он должен попасть на страницу обработчика (пользователь должен иметь возможность «увидеть» эту страницу), и эта страница содержит необходимые файлы из этого каталога библиотеки.Пока ваш сервер настроен для запуска PHP для всех сценариев * .php, в этом, вероятно, нет необходимости, так как скрытие сценариев PHP дает мало преимуществ.Если вы не хотите, чтобы они вызывались напрямую, и вы хотите оставить их в общедоступной области, попробуйте:

публичный скрипт:

define('INVOKED_BY_SCRIPT', true);
...
include "../library/hiddenScript.php";

«скрытый» скрипт:

if (!defined('INVOKED_BY_SCRIPT') || true !== INVOKED_BY_SCRIPT) {
    echo "Cannot invoke directly";
    exit;
}

Ваша база данных MySQL должна быть в /var/lib/mysql или там, где она установлена ​​по умолчанию.Обязательно запустите сценарий безопасности MySQL mysql_secure_installation, чтобы удалить пароли по умолчанию и проверить базы данных.

0 голосов
/ 06 февраля 2013

То, что вы, вероятно, ищете, это способ «скрыть» ваши исполняемые файлы за пределами корня документа, что вы можете сделать со структурой каталогов примерно так:

  • public_html
    • index.php <- (общедоступный индексный файл) </li>
    • изображения
    • htmlstuff
  • private_index.php <- (реальный индексный файл приложения) </li>
  • применение
  • TMP

Тогда для public_html / index.php у вас будет просто:

<?php
require_once('../private_index.php');
0 голосов
/ 04 апреля 2011
  • Вы не можете сделать HTML только для просмотра внутри iframe

  • НЕТ файлов, вызываемых 1). Это браузер пользователей, который вызывает ваши файлы.

Итак, просто оставьте структуру каталогов как есть, все в порядке.

0 голосов
/ 04 апреля 2011

Все, кроме включений, должно быть в вашем каталоге public_html.

Для 3 невозможно иметь скрипт PHP, на который может ссылаться форма, но он не доступен пользователю, набирающему вадрес в адресной строке.Лучшее, что вы можете сделать, это проверить переменные записи, чтобы увидеть, было ли что-либо опубликовано.Вы можете проверить переменную HTTP_REFERER, но я бы не рекомендовал это, поскольку на нее нельзя положиться.

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