как защитить каталог сервера с помощью .htaccess - PullRequest
4 голосов
/ 16 декабря 2009

Я разработал веб-сайт, и внутри него у меня есть ряд PHP-скриптов, которые взаимодействуют с моей системой. Например, если пользователь загружает изображение, это обрабатывается скриптом

image.php 

и если пользователь входит в систему, это обрабатывается скриптом

login.php

Все эти скрипты хранятся в папке с именем: scripts

Как я могу гарантировать, что кто-то не может получить доступ к этим страницам, но при этом гарантировать, что они могут использоваться системой? Я хочу убедиться, что страницы PHP будут принимать значения записей, получать значения и могут перенаправлять на другие страницы, но не будут напрямую доступны через адресную строку или загружены?

Я попытался заблокировать доступ, используя .htaccess, используя deny from all и Limit GET, POST, но это помешало работе системы, поскольку я вообще не мог получить доступ к этим файлам.

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009

Блокировка файлов с помощью htaccess делает файлы недоступными для запрашивающей стороны, например, посетитель страницы. Таким образом, вам нужен прокси-файл, чтобы передать запрос посетителя файлам. Для этого посмотрите шаблон MVC и шаблон Front Controller .

По сути, вам нужно будет направить все запросы в одну точку входа , например, index.php и решите оттуда, какое действие (ваши скрипты) вызывается для обработки запроса. Затем вы можете разместить свои скрипты и шаблоны вне общедоступной папки или, если это невозможно (на некоторых общих хостах), защитить папки с помощью htaccess, как вы уже сделали (DENY FROM ALL).

Чтобы использовать скрипт загрузки, вы должны иметь URL-адрес, например http://example.com/index.php?action=upload.

Сверхпростой FrontController так же прост, как

$scriptPath      = 'path/to/your/scripts/directory/';
$defaultAction   = 'action404.php';
$requestedAction = $_GET['action']; // you might want to sanitize this

switch($action) {
    case 'upload':
        $actionScript = 'image.php';
        break;
    case 'login':
        $actionScript = 'login.php';
        break;
    default:
        $actionScript = $defaultAction;
}
include $scriptPath . $actionScript;
exit;

После этого ваш actionScript будет делать все, что вам нужно сделать с запросом, включая перенаправление, доступ к базе данных, аутентификацию, загрузку содержимого, шаблоны рендеринга и т. Д. - все, что вы сочтете необходимым. Действие по умолчанию в приведенном выше примере может выглядеть следующим образом:

<?php // action404.php
    header('HTTP/1.1 404 File Not Found');
    fpassthru('path/to/template/directory/error404.html');

В PHP существует множество реализаций шаблона FrontController. Некоторые простые, некоторые сложные. В CodeIgniter Framework используется облегченная реализация MVC / FrontController, которая может быть не слишком сложной, если вы новичок в этом.

Как и в приведенном выше предложении Atli, вы можете использовать mod_rewrite для принудительной отправки всех запросов на index.php, а также использовать его для настройки ваших URL. Это обычная практика для сред MVC, и она широко освещалась здесь и в других местах.

1 голос
/ 16 декабря 2009

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

Один из способов, которым вы могли бы воспользоваться, - это создать сценарий «переключения» PHP, который бы включал в себя сценарии вместо того, чтобы Apache запрашивал их напрямую.

Например, если вместо этого у вас была scripts/image.php цель правила switch.php?file=image.php, то вроде:

RewriteRule ([^\.]+\.(jpe?g|png|gif)$ switch.php?file=image.php&rw=1&meta=$1 [L,QSA]

Вы можете добавить deny from all в файл scripts/.htaccess и сделать это в своем файле switch.php.

<?php
/** File: switch.php **/
$allowed_files = array(
    'login.php',
    'image.php'
);
$script_dir = 'scripts/';
if(isset($_POST['rw']) && in_array($_REQUEST['file'], $allowed_files)) {
    include $script_dir . $allowed_files[$_REQUEST['file']];
}
else {
    header('HTTP/1.1 404 File Not Found');
    include 'error404.html'; // Or something to that effect.
}
?>

В $_POST['rw'] есть слабая проверка, чтобы увидеть, пришло ли правило от RewriteRule, предназначенного для предотвращения прямых запросов к файлу. Довольно легко обойти, если вы знаете, что он есть, но эффективен против случайных запросов от ботов и тому подобного.

Таким образом, прямые запросы к scripts/image.php и switch.php?file=image.php не будут выполнены, но запросы к любому файлу изображения вызовут сценарий scripts/image.php.

0 голосов
/ 16 декабря 2009

Многие приложения просто помещают файлы, такие как ваши скрипты, не в общую папку (например, / public_html / или / www /), а в ту же корневую папку, что и ваша общая папка.

так нет root / public_html / и корень / public_html / скрипты /

но root / public_html / и корень / скрипты /

Посетители не могут получить доступ к чему-либо в папке над общедоступной папкой, но указав, например, /public_html/index.php файл '../scripts/yourscript.php', PHP может получить доступ к этим файлам и посетителям. не может. (папка ../ означает «перейти на один шаг вверх по иерархии папок»)

0 голосов
/ 16 декабря 2009

Я хочу убедиться, что страницы PHP будут принимать значения записей, получать значения и могут перенаправлять на другие страницы, но не будут напрямую доступны через адресную строку или загружены?

Пока Apache настроен на ассоциирование всех файлов .php с приложением PHP, никто не может сам загрузить содержимое PHP. Итак, если кто-то зашел на «mysite.com/image.php», PHP запустится. Пользователь НЕ будет видеть ваш контент PHP.

Это уже должно быть сделано в вашем файле httpd.conf как:

  • Приложение AddType / x-httpd-php .php .phtml

Теперь image.php будет ожидать определенных параметров записи. Если не считать реализации архитектуры MVC, как предлагал Atli, вы могли бы изящно и безопасно работать с любыми недостающими параметрами, если они не предоставлены. Затем пользователи могут получить доступ к странице напрямую, но с ней ничего не делать.

0 голосов
/ 16 декабря 2009

Вы можете установить запрет на всех в .htaccess и включить эти файлы из некоторого доступного каталога

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