file - para - Denegar el acceso a tipos de archivos específicos en un directorio específico
htaccess (3)
La directiva FilesMatch funciona únicamente en los nombres de archivo. No mira la porción del camino en absoluto.
Si desea especificar directivas en el archivo .htaccess raíz para controlar un subdirectorio, puede usar mod_rewrite .
Prueba esto:
RewriteRule ^uploads/.*/.(php|rb|py)$ - [F,L,NC]
Lo anterior bloqueará cualquier nombre de archivo que termine en .php o .rb o .py en el directorio / uploads o sus subdirectorios. Por ejemplo, bloqueará:
- /uploads/something.php
- /uploads/something/more.php
Tenga en cuenta que no hay una barra diagonal inicial en la regla de reescritura. La ruta que debe usar en la directiva será diferente dependiendo de dónde se coloque. La directiva anterior, si se coloca en el archivo .htaccess de la raíz del documento, funcionará para los archivos en un directorio llamado cargas que está directamente debajo de la raíz del documento.
Si bien lo anterior responde a su pregunta, sería más seguro permitir solo archivos específicos en lugar de intentar bloquearlos. A menudo, un servidor ejecutará archivos con extensiones distintas a las que usted ha enumerado.
Podrías hacer algo como esto:
RewriteCond %{REQUEST_URI} ^/uploads [NC]
RewriteCond %{REQUEST_URI} !/.(jpe?g|png|gif)$ [NC]
RewriteRule .* - [F,L]
Con lo anterior, si el URI de solicitud comienza con / uploads pero no finaliza con una de las extensiones especificadas, entonces está prohibido. Puede cambiar las extensiones a lo que se adapte a sus necesidades. Pero de esa manera, puede permitir extensiones según sea necesario en lugar de descubrir demasiado tarde que no pudo bloquear una.
Esta regla (de tu pregunta)
RewriteRule ^(uploads//.php) - [F,L,NC]
bloqueará
- /uploads/.php
- /uploads/.phpmore
pero no permite nada entre el nombre del directorio y la extensión del archivo.
Si va a utilizar reglas de rewirte, es posible que desee aprender más sobre regexp. A menudo me refiero a www.regular-expressions.info cuando necesito buscar algo.
Para algunas aplicaciones, los usuarios pueden cargar sus propios archivos. Dado que pueden ser archivos muy grandes, se les permite cargarlos a través de su propio cliente FTP.
Por supuesto, no me gustaría que suban algunos archivos PHP con los que puedan acceder a todos los demás archivos en el servidor. Una de las formas en que quiero evitar este comportamiento es negando el acceso a tipos de archivos específicos (como php, rb, py, etc.) solo en estas carpetas.
He encontrado formas de denegar el acceso a las carpetas, a los archivos, a los archivos en las carpetas, pero nada acerca de los tipos de archivos en las carpetas.
Intenté combinar lo que he encontrado, como:
<Files ~ "/.inc$">
Order allow,deny
Deny from all
</Files>
cambiando a
<Files uploads/ "/.inc$">
Order allow,deny
Deny from all
</Files>
o formas alternativas
RewriteRule ^(/.php) - [F,L,NC]
a
RewriteRule ^(uploads//.php) - [F,L,NC]
Sin embargo, no puedo averiguar qué sintaxis debo usar.
Entonces, por ejemplo, podría tener lo siguiente (ejemplo básico):
/index.php
/uploads/
hack.php
hack.rb
hack.py
pony.jpg
Quiero que hack.php / rb / py no esté disponible, pero que todo lo demás esté disponible. ¿Qué sintaxis debo usar?
Puede usar la siguiente solución más sencilla y de una línea para denegar el acceso a los tipos de archivos de certificados:
RedirectMatch 403 ^/folder/.+/.(png|gif|js)$
Esto devolverá un error 403 Acceso prohibido para los clientes si intentan acceder a /folder/file.extension .
Puedes poner un .htaccess en el directorio de upload
. Las directivas se aplicarán entonces a este directorio y a los directorios a continuación solamente. Vea cómo se aplican las directivas para más detalles.
Por lo tanto, un .htaccess con FilesMatch
puede restringir el acceso a los archivos que coincidan con *.inc
, *.php
etc., cuando se encuentre en el directorio public
<FilesMatch "/.(?:inc|php|py|rb)$">
Order allow,deny
Deny from all
</FilesMatch>