Come negare l'accesso a un file in .htaccess


112

Ho il seguente file .htaccess:

RewriteEngine On
RewriteBase /

# Protect the htaccess file
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Protect log.txt
<Files ./inscription/log.txt>
Order Allow,Deny
Deny from all
</Files>

# Disable directory browsing
Options All -Indexes

Sto cercando di impedire ai visitatori di accedere al seguente file:

domain.com/inscription/log.txt

ma quello che ho sopra non funziona: posso comunque accedere al file dal browser da remoto.

Risposte:


187

All'interno di un file htaccess, l'ambito della <Files>direttiva si applica solo a quella directory (immagino per evitare confusione quando le regole / direttive nell'htaccess delle sottodirectory vengono applicate sostituendo quelle del genitore).

Quindi puoi avere:

<Files "log.txt">  
  Order Allow,Deny
  Deny from all
</Files>

Per Apache 2.4+, useresti:

<Files "log.txt">  
  Require all denied
</Files>

In un file htaccess nella tua inscriptiondirectory. Oppure puoi usare mod_rewrite per gestire entrambi i casi negare l'accesso al file htaccess e al log.txt:

RewriteRule /?\.htaccess$ - [F,L]

RewriteRule ^/?inscription/log\.txt$ - [F,L]

Se stai usando IIS, fallo invece nel file web.config.
Shaun Luttin

1
L'utilizzo delle regole di riscrittura impedisce al mio codice di accedere ai contenuti di * .txt. Come lo aggireresti?
Pantaloni

8
"il campo di applicazione della <Files>direttiva si applica solo a quella directory" - no, non lo è. Si applica a quella directory ea tutte le sottodirectory sottostanti. Quindi <Files "log.txt">prenderà /log.txt e /inscription/log.txt .
MrWhite

1
Puoi aggiornare questa risposta poiché Order Allow,Denyè deprecata nella 2.4?
Telarian

18

Forte corrispondenza del modello : questo è il metodo che utilizzo qui a Perishable Press. Utilizzando una forte corrispondenza dei modelli, questa tecnica impedisce l'accesso esterno a qualsiasi file contenente " .hta ", " .HTA " o qualsiasi combinazione di questi ultimi senza distinzione tra maiuscole e minuscole. Per illustrare, questo codice impedirà l'accesso tramite una delle seguenti richieste:

  • .htaccess
  • .htaccess
  • .htaccess
  • testFILE.htaccess
  • filename.HTACCESS
  • FILEROOT.hTaCcEsS

..etc., etc. Chiaramente, questo metodo è molto efficace per proteggere i file HTAccess del tuo sito. Inoltre, questa tecnica include anche la fortificante direttiva " Satisfy All ". Tieni presente che questo codice deve essere inserito nel file HTAccess principale del tuo dominio:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

1
Ottengo un errore interno del server 500 quando utilizzo questo codice. Qualche idea sul perché? Sto usando Wordpress.
Keryn Gill

8
Non avrebbe più senso impedire agli utenti di accedere ai file dot? Usando qualcosa di simile <Files ~"^\..*">.
Steen Schütt

1
Ho bisogno di uno spazio tra la tilde e la prima virgoletta, almeno per me ne avevo bisogno. ~ SPACE "
Art Geigel

Ho ottenuto lo stesso comportamento disabilitando .files: <filesMatch "^ \ .. *"> order allow, deny deny from all </FilesMatch>
Pinonirvana

14

Non credo che la risposta attualmente accettata sia corretta. Ad esempio, ho il seguente .htaccessfile nella radice di un server virtuale (apache 2.4):

<Files "reminder.php">
require all denied
require host localhost
require ip 127.0.0.1
require ip xxx.yyy.zzz.aaa
</Files>

Ciò impedisce l'accesso esterno a reminder.phpcui si trova in una sottodirectory. Ho un .htaccessfile simile sul mio server Apache 2.2 con lo stesso effetto:

<Files "reminder.php">
        Order Deny,Allow
        Deny from all
        Allow from localhost
        Allow from 127.0.0.1
     Allow from xxx.yyy.zzz.aaa
</Files>

Non lo so per certo, ma sospetto che sia il tentativo di definire la sottodirectory specificamente nel .htaccessfile, vale a dire <Files ./inscription/log.txt> che ne sta causando il fallimento. Sarebbe più semplice mettere il .htaccessfile nella stessa directory di log.txtie nella inscriptiondirectory e funzionerà lì.


1
Ottieni il mio voto positivo, ha funzionato anche per il mio Apache 2.4.
Tschallacka

3

Inserisci la riga sottostante nel tuo file .htaccess e sostituisci il nome del file come desideri

RewriteRule ^(test\.php) - [F,L,NC]

-4

Bene, potresti usare il <Directory>tag ad esempio:

<Directory /inscription>
  <Files log.txt>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

Non usare ./perché se usi solo/ guarda la directory principale del tuo sito.

Per un esempio più dettagliato, visita http://httpd.apache.org/docs/2.2/sections.html


2
Ma un <Directory>contenitore non è consentito .htaccess. In .htaccess, il .htaccessfile stesso è il " Contenitore di directory " (file di configurazione per directory).
MrWhite

Bene, allora potresti usare il Redirect. Redirect /inscription/log.txt access_denied.htmlQuesto reindirizzerà l'utente a access_denied.htmlse l'utente va inscription/log.txtnella directory di iscrizione.
Nicholas English
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.