Como proteger um diretório no Apache usando uma sessão PHP

8

Eu tenho um site que usa a sessão do PHP para autenticação. Existe um diretório que eu gostaria de restringir o acesso ao que não usa qualquer PHP, é apenas cheio de conteúdo estático.

Eu simplesmente não sei como restringir o acesso sem que todas as solicitações passem por um script PHP. Existe alguma maneira de o Apache verificar as credenciais da sessão e restringir o acesso como Autenticação Básica?

    
por Cogsy 24.03.2010 / 03:14

5 respostas

5

A menos que você tenha alterado as configurações, os dados da sessão do PHP são armazenados em uma variação em seu próprio formato serialize () em um diretório temporário, e não é fácil obter isso sem usar o próprio PHP.

Infelizmente, você parece querer a velocidade dos arquivos estáticos veiculados enquanto autoriza dinamicamente cada solicitação, que não são objetivos realmente compatíveis. Você pode comprometer-se por ter um script PHP super leve que você usa mod_rewrite para reescrever pedidos para arquivos dentro dele, o que passa por coisas que estão bem. Exemplo super simples:

.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";
        }
 }

notavelmente, esse script PHP está rodando para sempre, então você precisará reiniciar o apache se você o alterar, eu acho.

Isso tudo não foi testado, mas é mais ou menos a direção que eu acho que você precisaria entrar.

Referências:

por 24.03.2010 / 17:25
1

Se você tivesse um cookie em particular que você pode esperar, então você pode testar sua ausência com o mod_rewrite e dar um 403 Forbidden.

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

Mas, se alguém soubesse que eles precisavam de um conjunto de cookies com "LoggedIn = true", eles poderiam facilmente contornar sua "proteção".

Uma sessão do PHP é específica para o PHP. O Apache não tem como usar nenhuma informação em uma sessão do PHP. Você teria que ter algum módulo de autenticação especificamente para fazer a verificação da sessão.

O que eu já vi na maioria das pessoas é que um script PHP manipula a veiculação do conteúdo estático, pois obtém a solicitação, verifica a sessão, lê o arquivo e envia o conteúdo com as informações MIME apropriadas. / p>     

por 24.03.2010 / 04:41
1

A solução convencional para esse problema é redirecionar todas as chamadas nessa pasta para um arquivo php, que verifica as permissões do usuário e, depois disso, lê o arquivo e o envia para o fluxo de saída ou redireciona o usuário para o " nenhuma permissão "site. Por exemplo ...

Outra maneira complicada de proteger seus arquivos é gerar um token a partir do session_id e um salt estático (e optianally do caminho do arquivo estático), e verifique-o pelo acesso ao arquivo. Então você tem que regenerar esse token em seu arquivo htaccess. Eu não sei se é possível apenas com .htaccess, ou você tem que usar php para isso. Encontrei uma solução semelhante aqui. Estou 99% convencido, que o md5 não é construído em um recurso de reescrita de mod.

    
por 16.02.2012 / 04:52
1

Meu plano para resolver este problema agora é

  1. Redirecionar o pedido para o PHP

    RewriteEngine on
    RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
    
  2. Autentique o usuário em PHP (todos os outros métodos de autenticação são talvez muito fracos ou exigem gravação em arquivos o tempo todo)

    if ( User::hasPermission() && isSane( $filePath ) ) {
        // 
        header( 'X-Sendfile: ' . $filePath );
    }
    
  3. Use o mod_xsendfile do Apache ( docs , github )

por 11.12.2015 / 02:32
0

Sim para autenticação básica se você estiver usando mod_php. link

    
por 24.03.2010 / 03:18