Как обезопасить каталог в Apache, используя сеанс PHP


8

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

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

Ответы:


5

Если вы не изменили настройки, данные сеанса 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, если вы его измените.

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

Ссылки:


Мне нравится такой подход, но мне интересно, есть ли у скрипта RewriteMap доступ к чему-либо, кроме stdin? Имеет ли он контекст файлов cookie и т. Д.?
Cogsy

На самом деле, да, у вас есть точка зрения. Вы можете отправить значение куки, используя синтаксис переменных окружения mod_rewrite (так что я думаю, что синтаксис станет чем-то вроде $ {auth: $ 1 $ COOKIES}, и вам придется разделить строку stdin по аргументам, с помощью этого метода вы могли бы забрать содержание сессии
Aquarion

Что если вы установили cookie при входе в систему с постоянным идентификатором авторизации (много битов), и вы проверили его при доступе к каталогу? Не лучшее решение, но оно может работать на страницах администратора ... (На страницах общего доступа к файлам это не работает, потому что пользователи могут делиться cookie ...)
inf3rno

1

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

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

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

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

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


Или вы можете изменить файл .htaccess при каждом входе в систему, выходе из системы и gc ...
inf3rno

1

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

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


1
Я люблю идею по ссылке Blogspot для использования RewriteMapна prg://…ресурс сценария оболочки , который делает все фактическое шифрование MD5 и проверку. Мне нужно проверить это и убедиться, что он работает на моей установке, но похоже, что он должен работать с ванильным Apache + модуль mod_rewrite.
Тридцать

1

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

  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 )


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.