2012-07-30 10 views
78

Ho il seguente file .htaccess:Come negare l'accesso a un file in .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 vietare ai visitatori di accedere al seguente file:

domain.com/inscription/log.txt 

ma quello che ho avere sopra non funziona: posso ancora accedere al file dal browser in remoto.

risposta

137

All'interno di un file htaccess, l'ambito della direttiva <Files> si applica solo a tale directory (credo di evitare confusione quando le regole/le direttive nell'htaccess delle sottodirectory vengono applicate a quelle supercorrenti dal padre).

Così si può avere:

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

In un file .htaccess nella directory inscription. Oppure è possibile utilizzare mod_rewrite per tipo di gestire entrambi i casi negano l'accesso al file .htaccess così come log.txt:

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

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

Se la vostra utilizzando IIS, fare questo nel file web.config, invece. –

+0

L'utilizzo delle regole di riscrittura impedisce al mio codice di accedere ai contenuti di * .txt. Come faresti a muoverti? – Pantss

+3

"l'ambito della direttiva' 'si applica solo a quella directory" - no. Si applica a quella directory _e_ a tutte le sottodirectory sottostanti. Quindi '' catturerà '/ log.txt' _and_'/inscription/log.txt'. – MrWhite

13

Forte pattern matching - questo è il metodo che uso qui a deperibili Press. Utilizzando la combinazione di motivi avanzata, questa tecnica impedisce l'accesso esterno a qualsiasi file contenente ".hta", ".HTA" o qualsiasi combinazione insensibile alle maiuscole/minuscole. Per illustrare, questo codice impedirà l'accesso attraverso una delle seguenti richieste:

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

.. etc, ecc. Chiaramente, questo metodo è altamente efficace per proteggere i file HTAccess del tuo sito. Inoltre, questa tecnica include anche la direttiva "Satisfy All". Si noti che questo codice deve essere inserito nella root file HTAccess del tuo dominio:

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

Viene visualizzato un errore del server interno 500 quando si utilizza questo codice. Qualche idea del perché? Sto usando Wordpress. –

+3

Non avrebbe più senso semplicemente non consentire agli utenti di accedere a dotfile? Usando qualcosa come ''. –

7

Non credo la risposta attualmente accettato è corretta. Ad esempio, ho il .htaccess seguente file 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> 

Questo impedisce l'accesso esterno al reminder.php che è in una sottodirectory. Ho un simile .htaccess file 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 ho il sospetto che sia il tentativo di definire la sottodirectory specificamente nel file .htaccess, cioè<Files ./inscription/log.txt> che sta causando il fallimento. Sarebbe più semplice inserire il file .htaccess nella stessa directory di log.txt, ad es.nella directory inscription e funzionerà lì.

+0

Hai ottenuto il mio upvote, questo ha funzionato anche per il mio apache 2.4. – Tschallacka

0

Posizionare la riga sotto nel file .htaccess e sostituire il nome del file come si desidera

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

Ebbene si potrebbe usare l'etichetta <Directory> ad esempio:

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

Non utilizzare ./ perché se usi semplicemente / guarda nella directory principale del tuo sito.

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

+1

Ma un '' 'contenitore non è permesso in' .htaccess'. In '.htaccess', il file' .htaccess' è il "_Directory_ container" (file di configurazione per-directory). – MrWhite

+0

Bene, allora potresti usare il Redirect. 'Redirect /inscription/log.txt access_denied.html' Questo reindirizzerà l'utente a' access_denied.html' se l'utente accede a 'inscription/log.txt' nella directory di iscrizione. –

Problemi correlati