Назад | Перейти на главную страницу

Как защитить каталог в Apache с помощью сеанса PHP

У меня есть сайт, который использует сеанс PHP для аутентификации. Есть один каталог, к которому я хотел бы ограничить доступ, который не использует PHP, он просто заполнен статическим контентом.

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

Если вы не изменили настройки, данные сеанса PHP хранятся в вариации собственного формата serialize () во временном каталоге, и добиться этого без использования самого PHP непросто.

К сожалению, вам нужна скорость статических обслуживаемых файлов при динамической авторизации каждого запроса, что на самом деле несовместимо. Вы можете пойти на компромисс, имея сверхлегкий PHP-скрипт, в который вы затем используете mod_rewrite для перезаписи запросов к файлам внутри него, которые проходят через все, что нормально. Супер простой пример:

.htaccess:

 RewriteEngine On
 RewriteMap auth prg:auth.php
 RewriteRule (.*) ${auth:$1}

auth.php:

#!/usr/bin/php
 <?PHP
 set_time_limit(0); # This program needs to run forever. 
 $stdin = fopen("php://stdin","r"); # Keeps reading from standard in
 while (true) {
        $line = trim(fgets($stdin));
        if (isset($_SESSION['USER_LOGGED_IN'])) {
                echo $line\n";
        } else {
                echo "authfailed.html\n";
        }
 }

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

Это все непроверено, но я думаю, что примерно в этом направлении вам следует пойти.

Ссылки:

Обычное решение этой проблемы - перенаправить каждый вызов этой папки в файл php, который проверяет разрешения пользователя, а после этого он читает файл и отправляет его в выходной поток или перенаправляет пользователя на «нет разрешения». сайт. Например...

Еще один хитрый способ защитить ваши файлы - это сгенерировать токен из session_id и статической соли (и, возможно, из статического пути к файлу) и проверить его при доступе к файлу. Таким образом, вам нужно регенерировать этот токен в файле htaccess. Я не знаю, возможно ли это только с .htaccess, или для этого нужно использовать php. Я нашел здесь похожее решение. Я на 99% убежден, что md5 не является встроенной функцией перезаписи модов.

Если у вас есть определенный файл cookie, которого вы можете ожидать, вы можете проверить его отсутствие с помощью mod_rewrite и дать 403 Forbidden.

RewriteCond %{HTTP_COOKIE} !LoggedIn=true
RewriteRule .* - [F,L]

Но если бы кто-нибудь знал, что им нужен файл cookie с параметром «LoggedIn = true», он мог бы легко обойти вашу «защиту».

Сеанс PHP специфичен для PHP. Apache не имеет возможности использовать какую-либо информацию в сеансе PHP. Вам понадобится какой-то модуль аутентификации специально для проверки сеанса.

Я видел, что большинство людей используют PHP-скрипт для обработки статического контента, так как он получает запрос, проверяет сеанс, читает файл и отправляет контент с соответствующей информацией MIME.

Мой план решить эту проблему сейчас:

  1. Перенаправить запрос на PHP

    RewriteEngine on
    RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
    
  2. Аутентифицировать пользователя в PHP (все остальные методы аутентификации могут быть слишком слабыми или требуют постоянной записи в файлы)

    if ( User::hasPermission() && isSane( $filePath ) ) {
        // 
        header( 'X-Sendfile: ' . $filePath );
    }
    
  3. Используйте Apache mod_xsendfile (документы, github)

Да для базовой аутентификации, если вы используете mod_php. http://php.net/manual/en/features.http-auth.php