Protegendo imagens do acesso direto verificando a sessão atual do PHP com mod_rewrite

1

Estou trabalhando em uma solução para um problema em que os usuários poderiam acessar imagens (neste caso, arquivos PDF) armazenadas em uma pasta fora da raiz do servidor. Normalmente, meu aplicativo valida usuários por meio de scripts e sessões PHP. O que não está acontecendo agora é impedir que usuários não logados acessem potencialmente os PDFs.

A solução que estou procurando (eu acho) precisa estar ligada ao Apache. Eu vi uma solução interessante usando RewriteMap & RewriteRule, no entanto, o exemplo envolveu colocar isso em um arquivo .htaccess no diretório PDF. Não é possível fazer isso com o Apache (erro: RewriteMap não permitido aqui). Eu acredito que as diretivas de reescrita precisam entrar no meu httpd.conf, ao qual eu tenho acesso.

Portanto, o exemplo que encontrei (que resultou em 'reescrever mapa não permitido aqui') está aqui:

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

O auth.php apenas verifica a sessão do PHP e redireciona para um script de login, se necessário.

Estou lendo que tenho que colocar isso no meu httpd.conf. Como eu especificaria que o RewriteMap deveria ocorrer somente em um diretório específico (incluindo subdiretórios)?

    
por a coder 29.03.2012 / 19:46

2 respostas

2

Eu provavelmente lidaria com isso usando o RewriteRule em vez do RewriteMap. Crie uma regra mod_rewrite que redirecione as solicitações do pdf para um arquivo php

RewriteEngine on
RewriteRule ^(.*\.pdf)$ /path/to/auth.php?i=$1

Você pode então fazer com que o auth.php autentique a sessão e cuspa o conteúdo real do arquivo PDF. Eu fiz o mesmo usando os arquivos RewriteRule e jpg.

RewriteRule ^([^thumb].*\.[jJ].*)$ /auth.php.php?i=$1

Eu, então, uso auth.php para modificar a imagem com base na sessão e em outros fatores e, em seguida, cuspo-a de volta para o cliente. Por exemplo:

$last_modified = gmdate('D, d M Y H:i:s T', filemtime ($image));
header("Last-Modified: $last_modified");
header("Content-Type: image/jpeg");
imagejpeg($image,NULL,95);

Você também pode fazer algumas coisas legais, como adicionar uma marca d'água exclusiva e qualquer outro processamento que desejar na imagem, e suspeito que com as funções de gravação, em um arquivo PDF.

    
por 29.03.2012 / 20:34
1

Você pode agrupar essas diretivas em um bloco <Location /directory> (se desejar corresponder a um URI) ou em um bloco <Directory /var/www/html/directory> (se quiser corresponder a um caminho do sistema de arquivos).

Ou você pode apenas alterar a parte do padrão do RewriteRule para corresponder apenas ao caminho do URI desejado:

RewriteRule (^/directory.*) ${auth:$1}
    
por 29.03.2012 / 20:26