negar acesso direto a uma pasta e arquivo pelo htaccess

134

Aqui está o cenário:

  • Há um index.phparquivo na pasta raiz
  • alguns arquivos estão incluídos index.phpe estão na includespasta
  • 1 outro arquivo ( submit.php) está na pasta raiz para a ação de envio do formulário.

Quero restringir o acesso direto do usuário aos arquivos na includespasta pelo htaccess. também para submit.php. Mas incluir funcionará para index.phparquivo. Por exemplo, se o usuário digitar www.domain.com/includes/somepage.php, o restringirá (pode ser redirecionado para uma página de erro).

Imrul.H
fonte

Respostas:

266

Gostaria apenas de mover a includespasta para fora da raiz da web, mas se você quiser bloquear o acesso direto a toda a includespasta, poderá colocar um .htaccessarquivo nessa pasta que contenha apenas:

deny from all

Dessa forma, você não pode abrir nenhum arquivo dessa pasta, mas pode incluí-los no php sem problemas.

jeroen
fonte
7
Outro arquivo poderá fazer ajax solicitar o arquivo presente nessa pasta?
Chaitanya Chandurkar
16
@ChaitanyaChandurkar Não, uma solicitação ajax é uma solicitação http normal, pelo que será negada.
jeroen
Sr b / c I nova programação web. Como posso adicionar uma exceção para acessar meu arquivo index.php?
PhatHV
Eu costumava negar de todo e é restrito a cada url..not mesmo mostrando página de login .. :(
Aamir
@Aamir Isso está correto, nenhum URL nessa pasta estará acessível, mas você pode incluí-los em outros arquivos sem problemas.
jeroen
56

Esta é uma mod_rewritesolução com base pura :

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

Isso mostrará o erro proibido de usar se o URI contiver um /includes/ou/submit.php

anubhava
fonte
3
Bom trabalho ao endereçar o arquivo de envio
CTS_AE 12/11
29

É possível usar uma diretiva Arquivos e proibir o acesso a todos os arquivos e usá-lo novamente para definir os arquivos acessíveis:

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
luke1985
fonte
7
Não tenho certeza sobre quem postou a pergunta, se o problema foi resolvido ou não, mas essa é a beleza de SO, pois a resposta múltipla pode ajudar muitos membros. Esta última resposta resolveu meu problema. Quero permitir que os sites obtenham arquivos css, mas sem acesso a fontes ttf ou otf, e boom! resolvido.
Moxet Khan
Depois disto, eu não estou abel para acessar arquivos em subpastas
Gintare Statkute
14

Solução baseada em 1 lin_ mod_alias:

RedirectMatch 403 ^/folder/file.php$

Isso mostrará o erro proibido para /folder/file.php

Amit Verma
fonte
1
+1 - Isso é realmente muito bom, porque ninguém pode ver quais arquivos existem se você aplicar 404 a uma pasta inteira, usando regex ^folder.
precisa
9

Se bem entendi, você só quer negar o acesso à pasta inclui?

Um .htaccess com uma diretiva 'DENY FROM ALL' colocada na pasta de inclusões seria suficiente.

mainegreen
fonte
8

Seu Q vem em duas partes, as soluções jeroen e anubhava funcionam para a parte I - negando acesso a / inclui. anubhava também trabalha para a parte II. Eu prefiro o último porque eu uso umDOCROOT/.htaccess qualquer maneira e isso mantém todo esse controle em um arquivo.

No entanto, o que eu queria discutir é o conceito de "negar acesso a submit.php". Se você não quiser usarsubmit.php , por que tê-lo no DOCROOT? Eu suspeito que a resposta aqui é que você o usa como um alvo de ação em alguns formulários e só deseja que seja acionado quando o formulário é enviado e não diretamente, por exemplo, de um spambot.

Se isso for verdade, você não poderá usar a parte II de anubhava, pois isso fará com que seu formulário falhe. O que você pode fazer aqui é (i) .htaccessverificar se o referenciador era sua própria página de índice:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

E (ii) dentro do seu gerador de formulários index.php do PHP incluem alguns campos ocultos para um registro de data e hora e validação. A validação pode ser, digamos, os 10 primeiros caracteres de um MD5 do registro de data e hora e algum segredo interno. Ao processar o envio, você pode (i) validar se o carimbo de data e hora corresponde e (ii) o carimbo de data e hora está, digamos, a 15 minutos do horário atual.

Isso pode impedir o envio de spam, pois a única maneira prática de um spammer obter um par de carimbo de data / hora válido seria analisar um formulário, mas esse rascunho teria apenas uma vida útil de 15 minutos.

TerryE
fonte
6

Dependendo de outras opções possíveis definidas em um nível superior, você pode precisar colocar o seguinte no arquivo .htaccess no diretório de inclusão:

Satisfy all
Order deny,allow
Deny from all

Eu me deparei com isso quando o diretório superior definiu a autenticação básica, incluindo a linha:

Satisfy any

Isso estava impedindo que minha negação fosse efetivada porque os usuários foram autenticados.

Keith
fonte
1

Você pode adicionar o comando abaixo ao .htaccessarquivo

Deny from all
ErrorDocument 403 "nothing is here"

Ele exibirá a mensagem "nada está aqui" no caso de acesso não autorizado.

Se você deseja redirecionar por um código de erro para uma determinada página, pode definir um comando da seguinte maneira:

ErrorDocument 404 "/errors/404.html"

Ele será redirecionado para a /errors/404.htmltela e mostrará a página personalizada não encontrada.

user1324491
fonte