Negar tudo, permitir apenas um IP através do htaccess

156

Estou tentando negar tudo e permitir apenas um único IP. Mas, gostaria de ter o seguinte htaccess trabalhando para esse único IP. Não estou encontrando uma maneira de ter os dois funcionando: negar tudo e permitir apenas um, além das seguintes opções:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

Existe uma maneira de fazer isso funcionar?

punkbit
fonte

Respostas:

356
order deny,allow
deny from all
allow from <your ip> 
b101101011011011
fonte
95
NOTA! O Apache é sensível a espaços no htaccess. Não permita nenhum espaço entre negar, permitir. Ou seja, não escreva ordem negar, permitir.
H.Rabiee
2
INFO: - funciona também para IPv6! basta adicionar outra linha comallow from yourIPv6
jave.web
É possível no nginx?
shgnInc
10
Nota sobre a documentação 2.4 : as diretivas Allow, Deny e Order, fornecidas por mod_access_compat, foram descontinuadas e desaparecerão em uma versão futura. Você deve evitar usá-los e evitar tutoriais desatualizados que recomendem seu uso.
Martin Schneider
4
Como @ MA-Maddin apontou, - então mod_access_compat está obsoleto. Este post mostra como fazer em versões mais recentes. E também se deve considerar, se o servidor estiver usando um proxy, pois isso exibirá o IP do proxy para o visitante. Este post sugere uma solução para isso.
Zeth
115

Eu sei que esta pergunta já tem uma resposta aceita, mas a documentação do Apache diz:

As diretivas Allow, Deny e Order, fornecidas por mod_access_compat, foram descontinuadas e desaparecerão em uma versão futura. Você deve evitar usá-los e evitar tutoriais desatualizados que recomendem seu uso.

Portanto, uma resposta mais preparada para o futuro seria:

<RequireAll>
    Require ip xx.xx.xx.xx yy.yy.yy.yy
</RequireAll>

Felizmente, ajudei a impedir que esta página se torne um desses "tutoriais desatualizados". :)

Rok Sprogar
fonte
Onde colocamos nosso IP?
Gary Carlyle Cozinhe
1
Caminho a percorrer! Essa solução deve ser aceita, pois não está apenas funcionando, mas também é resistente ao tempo.
6opko 11/11/19
A outra resposta não ajudou na minha situação. Mas este fez. Obrigado, por atualizar um tópico antigo.
Johann Dyck
1
O exemplo desta resposta permite o acesso de dois IPs? Então, para adicionar vários IPs, basta colocar um espaço entre eles? Você pode colocar Require ipvárias linhas para torná-lo mais legível pelo usuário ou todos os IPs precisam estar em uma linha?
Hastig Zusammenstellen 02/09
se você usasse isso, como redirecionaria para uma nova página temporária, como algumas das respostas?
rudtek
39

Isso pode ser aprimorado usando a diretiva projetada para essa tarefa.

ErrorDocument 403 /specific_page.html
Order Allow,Deny
Allow from 111.222.333.444

Onde 111.222.333.444 é o seu endereço IP estático.

Ao usar a diretiva "Permitir Pedido, Negar", as solicitações devem corresponder a Permitir ou Negar; se nenhuma for atendida, a solicitação será negada.

http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order

MickeyRoush
fonte
1
como adicionar um uRL personalizado?
secondight 25/02/19
32

Versão ligeiramente modificada do acima, incluindo uma página personalizada a ser exibida para aqueles que têm acesso negado:

ErrorDocument 403 /specific_page.html
order deny,allow
deny from all
allow from 111.222.333.444

... e dessa forma as solicitações que não forem de 111.222.333.444 verão specific_page.html

(postar isso como comentário parecia terrível porque novas linhas se perdiam)

Oliver Maksimovic
fonte
Oi. Eu tenho exatamente o mesmo código que você tem no meu .htaccess, mas continuo recebendo um erro de 500. A página especificada é chamada test.htmle está na mesma pasta que o .htaccess. No entanto, não consigo ver os logs (não permitidos no servidor). Você tem alguma idéia de por que eu poderia ter esse problema? Quando estou obtendo o caminho do arquivo através de um cliente ftp, ele diz /test.htmlque o caminho não deve ser um problema, certo?
Musterknabe
Além disso, o erro 500 ocorre mesmo quando eu tenho a linha com o documento do erro comentado. Portanto, esse não deveria ser o problema. Existe uma razão para as outras três linhas não funcionarem? No meu .htaccess, tenho mais três linhas, onde redireciono non-www para www, mas é isso. Mas eu também estou recebendo o erro quando tenho apenas as três linhas com negar, permitir, etc.
Musterknabe
Como adicionar um URL personalizado?
SecondSight
8

Melhorando um pouco mais as respostas anteriores, uma página de manutenção pode ser exibida para seus usuários enquanto você realiza alterações no site:

ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #.#.#.#

Onde:

IvanRF
fonte
Quando uso o ErrorDocument 403, recebo um erro 403 adicional para esse arquivo maintenance.html, porque ele também não pode acessar esse arquivo. Você tem uma solução para isso?
Zdravko Donev
3

Além da resposta de @David Brown, se você deseja bloquear um IP, primeiro deve permitir todos e depois bloquear os IPs da seguinte forma:

    <RequireAll>
      Require all granted
      Require not ip 10.0.0.0/255.0.0.0
      Require not ip 172.16.0.0/12
      Require not ip 192.168
    </RequireAll>

First line allows all
Second line blocks from 10.0.0.0 to 10.255.255.255
Third line blocks from 172.16.0.0 to 172.31.255.255
Fourth line blocks from 192.168.0.0 to 192.168.255.255

Você pode usar qualquer uma das anotações mencionadas acima para atender às suas necessidades de CIDR.

Rafa Carvalhido
fonte
Obrigado, esta é a maneira correta de lidar com o Apache 2.4!
Aleksandar Pavić
2

Você pode usar o seguinte no htaccess para permitir e negar acesso ao seu site:

SetEnvIf remote_addr ^1\.2\3\.4\.5$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip

Primeiro, definimos uma variável de ambiente allowip se o endereço IP do cliente corresponder ao padrão, se o padrão corresponder, a variável de ambiente allowip recebe o valor 1 .

Na próxima etapa, usamos diretivas Permitir, negar para permitir e negar acesso ao site. Order deny,allowrepresenta a ordem de denye allow. deny from allesta linha diz ao servidor para negar a todos. a última linha allow from env=allowedippermite o acesso a um único endereço IP para o qual configuramos a variável env.

Substitua 1\.2\.3\.4\.5pelo seu endereço IP permitido.

Referências:

Amit Verma
fonte
1
Quais são os profissionais de usá-lo em vez de apenas Permitir de 324.234.22.1?
Berry M.
2

Não consegui usar o método 403 porque queria a página de manutenção e as imagens da página em uma subpasta do meu servidor, portanto, usei a seguinte abordagem para redirecionar para uma 'página de manutenção' para todos, exceto um único IP *

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !**.**.**.*
RewriteRule !^maintenance/ http://www.website.co.uk/maintenance/ [R=302,L]

Fonte: Criando uma página de espera para ocultar seu blog WordPress

METALFURIA
fonte
Esta solução é a mais simples - eu prefiro
Gerfried
1

Você pode ter mais de um IP ou até algum outro tipo de permissão, como usuário, nome do host, ... mais informações aqui https://www.askapache.com/htaccess/setenvif/

SetEnvIf remote_addr ^123.123.123.1$ allowedip=1
SetEnvIf remote_addr ^123.123.123.2$ allowedip=1
SetEnvIf remote_addr ^123.123.123.3$ allowedip=1
SetEnvIf remote_addr ^123.123.123.4$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip
Meloman
fonte
0

Se você quiser usar mod_rewrite para controle de acesso, poderá usar condições como agente do usuário, referenciador http, endereço remoto etc.

Exemplo

RewriteCond %{REMOTE_ADDR} !=*.*.*.* #you ip address
RewriteRule ^$ - [F]

Referências:

Abhishek Gurjar
fonte
0

Adicione o seguinte comando no arquivo .htaccess. E coloque esse arquivo na sua pasta htdocs.

Order Deny,Allow
Deny from all
Allow from <your ip> 
Allow from <another ip> 
Ramsha Omer
fonte
0
ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #:#:#:#:#:#

Para mim, isso parece funcionar (usando o IPv6 em vez do IPv4). Não sei se isso é diferente para alguns sites, mas para os meus isso funciona.

TigerMANEK426
fonte