Bloqueia o acesso a todos os arquivos php no subdiretório

3

Eu preciso bloquear o acesso a todos os arquivos .php em um subdiretório da minha raiz da web. Eu sei que eu poderia criar um .htaccess neste subdiretório e usar o seguinte:

<FilesMatch "\.(?i:php)$">
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>

No entanto, por questão de transparência / simplicidade, eu realmente preciso fazer o bloqueio do .htaccess da raiz da Web e NÃO por meio de um no subdiretório.

Se eu fosse bloquear um arquivo específico do root .htaccess eu usaria isso:

<Location /wp-includes/somefile.php>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
</FilesMatch>

Eu li que você não pode usar LocationMatches no .htaccess, então há outra maneira que eu possa fazer isso (sem criar um .htaccess para o subdiretório?

UPDATE Parece que <Location> não pode ser usado em .htaccess.

    
por Phill Healey 13.10.2018 / 15:46

1 resposta

3

As diretivas <Location> (e <LocationMatch> ) correspondem ao caminho da URL, não estritamente ao caminho do sistema de arquivos, portanto, não é necessariamente recomendado usá-lo para controlar o acesso de qualquer maneira (na configuração do servidor).

Se você tiver acesso à configuração do servidor, basta usar o contêiner <Directory> relevante.

Sem usar .htaccess no subdiretório, você poderia usar mod_setenvif para definir uma variável de ambiente condicionalmente com base na URL solicitada e, em seguida, bloquear com base nessa variável env.

Por exemplo:

SetEnvIf Request_URI "^/subdirectory/.+\.php$" BLOCK

<IfModule !mod_authz_core.c>
  Order deny,allow
  Deny from env=BLOCK
</IfModule>
<IfModule mod_authz_core.c>
  <RequireAll>
    Require all granted
    Require not env BLOCK
  </RequireAll>
</IfModule>

Eu inverti a diretiva Order (Apache 2.2), caso contrário, sem uma diretiva Allow adicional, tudo seria bloqueado.

As diretivas do Apache 2.4 precisam estar dentro de um contêiner <RequireAll> , primeiro concedendo todo o acesso (caso contrário, tudo está bloqueado) e depois negando o acesso condicionalmente quando o BLOCK env var estiver definido. Você não pode ter uma diretiva Require negada - em um contêiner <RequireAny> implícito - já que ela não terá nenhum efeito (na verdade, isso resulta em um erro 500).

Observe que isso bloqueia URLs, não estritamente como "arquivos". Bloqueia solicitações parecidas com .php arquivos em /subdirectory - independentemente de existirem realmente como arquivos físicos.

Como alternativa, você pode usar o mod_rewrite (Apache 2.2 e 2.4) no topo do seu arquivo root .htaccess :

RewriteEngine On

RewriteRule ^subdirectory/.+\.php$ - [F]

Isso simplesmente bloqueia (403 Proibidas) todas as URLs que terminam em .php e que estão no /subdirectory solicitado. Se você especificamente precisar retornar apenas um 403 para URLs que mapeiam para arquivos reais, então você pode incluir uma condição adicional (embora isso seja provavelmente um desperdício desnecessário):

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^subdirectory/.+\.php$ - [F]

Altere F para R=404 se você quiser retornar um 404.

    
por 16.10.2018 / 02:43