denegar el acceso directo a una carpeta y archivo por htaccess

134

Aquí está el escenario:

  • Hay un index.phparchivo en la carpeta raíz
  • se incluyen algunos archivos en los index.phpque se encuentran en la includescarpeta.
  • submit.phpHay otro archivo ( ) en la carpeta raíz para la acción de envío de formulario.

Quiero restringir el acceso directo del usuario a los archivos en la includescarpeta por htaccess. también para submit.php. Pero include funcionará para el index.phparchivo. Por ejemplo, si el usuario escribe www.domain.com/includes/somepage.php, lo restringirá (puede ser redirigido a una página de error).

Imrul.H
fuente

Respuestas:

266

Simplemente movería la includescarpeta fuera de la raíz web, pero si desea bloquear el acceso directo a toda la includescarpeta, puede colocar un .htaccessarchivo en esa carpeta que contenga solo:

deny from all

De esa manera no puede abrir ningún archivo de esa carpeta, pero puede incluirlos en php sin ningún problema.

jeroen
fuente
77
¿Podrá otro archivo hacer una solicitud ajax al archivo presente en esa carpeta?
Chaitanya Chandurkar
16
@ChaitanyaChandurkar No, una solicitud ajax es una solicitud http normal, por lo que será denegada.
jeroen 02 de
Sr b / c I nueva programación web. ¿Cómo puedo agregar una excepción para acceder a mi archivo index.php?
PhatHV
Solía ​​negar de todos y restringía cada URL ... ni siquiera mostraba la página de inicio de sesión ... :(
Aamir
@Aamir Eso es correcto, no se podrá acceder a ninguna url en esa carpeta, pero puede incluirlas en otros archivos sin ningún problema.
jeroen
56

Esta es una mod_rewritesolución de base pura :

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

Esto mostrará un error prohibido de usar si URI contiene /includes/o/submit.php

anubhava
fuente
3
Buen trabajo al abordar el archivo de envío
CTS_AE
29

Es posible usar una directiva de Archivos y no permitir el acceso a todos los archivos, luego usarlo nuevamente para configurar los archivos que son accesibles:

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

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
luke1985
fuente
77
No estoy seguro acerca de quién publicó la pregunta si su problema se resolvió o no, pero esta es la belleza de SO que la respuesta múltiple puede ayudar a muchos miembros. Esta última respuesta resolvió mi problema. Quiero permitir que los sitios obtengan archivos css pero no tengo acceso a las fuentes ttf u otf, y ¡boom! resuelto.
Moxet Khan
después de esto, no puedo acceder a archivos en subcarpetas
Gintare Statkute
14

Solución basada en 1 liner mod_alias:

RedirectMatch 403 ^/folder/file.php$

Esto mostrará un error prohibido para /folder/file.php

Amit Verma
fuente
1
+1: esto es realmente muy bueno, porque nadie puede ver qué archivos existen si aplica 404 a una carpeta completa, utilizando expresiones regulares ^folder.
bytecode77
9

Si entiendo correctamente, ¿solo quiere negar el acceso a la carpeta de inclusiones?

Un .htaccess con una directiva 'DENY FROM ALL' colocada en la carpeta de inclusión haría el truco.

mainegreen
fuente
8

Su Q viene en dos partes, las soluciones de jeroen y anubhava funcionan para la parte I: denegar el acceso a / incluye. Anubhava también funciona para la parte II. Prefiero el último porque utilizo un de DOCROOT/.htaccesstodos modos y esto mantiene todo ese control en un archivo.

Sin embargo, lo que quería discutir es el concepto de "negar el acceso a submit.php". Si no quieres usar submit.php, ¿por qué tenerlo en DOCROOT? Sospecho que la respuesta aquí es que lo usa como objetivo de acción en algunos formularios y solo quiere que se active cuando se envía el formulario y no directamente, por ejemplo, desde un robot de spam.

Si esto es cierto, entonces no puede usar la parte II de anubhava, ya que esto hará que su formulario falle. Lo que puede hacer aquí es (i) con la .htaccessverificación para asegurarse de que el referente sea su propia página de índice:

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

Y (ii) dentro de su generador de formularios PHP index.php incluya algunos campos ocultos para una marca de tiempo y validación. La validación podría ser, digamos, los primeros 10 caracteres de un MD5 de la marca de tiempo y algún secreto interno. Al procesar el envío, puede (i) validar que la marca de tiempo y la validación coinciden, y (ii) la marca de tiempo se encuentra dentro de, digamos, 15 minutos de la hora actual.

Esto puede evitar el envío de correo no deseado, ya que la única forma práctica en que un spammer podría obtener un par válido de marca de tiempo / validación sería analizar un formulario, pero este raspado solo tendría una vida útil de 15 minutos.

TerryE
fuente
6

Dependiendo de otras posibles opciones establecidas en un nivel superior, es posible que deba poner lo siguiente en su archivo .htaccess en su directorio de inclusiones:

Satisfy all
Order deny,allow
Deny from all

Me encontré con esto cuando el directorio superior definió la autenticación básica, incluida la línea:

Satisfy any

Esto impedía que mi negación de todos entrara en vigor porque los usuarios estaban autenticados.

Keith
fuente
1

Puede agregar el siguiente comando al .htaccessarchivo

Deny from all
ErrorDocument 403 "nothing is here"

Mostrará el mensaje "no hay nada aquí" en caso de acceso no autorizado.

Si desea redirigir mediante un código de error a una página determinada, puede definir un comando de la siguiente manera:

ErrorDocument 404 "/errors/404.html"

Redirigirá a la /errors/404.htmlpantalla personalizada y no mostrará la página personalizada.

usuario1324491
fuente