2010-03-02 10 views
6

Mi página web es un repositorio mercurial con múltiples subrepositories. Necesito asegurarme de negar el acceso a todos los archivos en cada directorio .hg en el servidor.de seguridad: Denegar el acceso a .hg/* a través de mod_rewrite

Por ejemplo, he http://example.com/.hg/ y http://example.com/subrepo1/.hg/

He añadido lo siguiente a .htaccess:

<Files ~ "^\.(hg|ht)"> 
    Order allow,deny 
    Deny from all 
</Files> 

Este es un buen comienzo, ya que impide el acceso a los archivos que comienzan con .hg y .ht , pero no niega el acceso a los archivos dentro de los directorios .hg, por lo que si alguien escribe, por ejemplo http://example.com/.hg/branch, el archivo de la rama se mostrarán en su navegador.

¿Qué debo hacer para asegurarme de que estos archivos no se muestran al usuario? Me gustaría enviar un 403 o un 404 al navegador si alguien intenta acceder a un archivo dentro de cualquier directorio .hg en mi servidor.

Esta pregunta también es relevante para cualquier persona cuyo sitio web sea un repositorio de subversión/svn.

Respuesta

7

Si aún no tiene utilizar mod_rewrite, a continuación, puedes hacer esto:

RedirectMatch 404 /\\.hg(/|$) 

(La revelación completa: respuesta adaptada para Mercurial desde las this question de hacer lo mismo para Subversion).

+0

Aparece un error de 500 cuando pruebo cualquier cosa con Directory, DirectoryMatch, Location o LocationMatch, así que estoy pensando que no está permitido dentro de .htaccess. El RedirectMatch funciona como un encanto, sin embargo. ¡Gracias! – Tex

+0

@Tex - Voy a editar eso - parece que el OP de la pregunta SVN tuvo problemas para hacer que 'DirectoryMatch' también funcione. –

+0

Según tengo entendido, 'Directory',' DirectoryMatch', 'Location' y' LocationMatch' no están permitidos en .htaccess. – Tex

0

Usted siempre tiene la posibilidad de colocar archivos .htaccess en estas carpetas y denegar todos los accesos dentro de la Carpeta.

Supongo que quiere una solución, donde no tiene que poner los archivos .htaccess en cada carpeta y subcarpeta.

Pruebe lo siguiente (suponiendo que tiene acceso ssh al servidor web):

  • Cambio en el DocumentRoot de su sitio
  • crear un archivo .htaccess

contenido:

Order deny, allow 
Deny from all 
  • ejecute el siguiente comando:

    find . -type d -name .hg -exec cp ./.htaccess {} \;

  • eliminar Posteriormente el archivo .htaccess de la raíz del documento de nuevo

+0

Hola, también me gusta esta solución, pero tiene un inconveniente: los archivos dentro de los directorios .hg no están versionados, y estoy bastante seguro de que no están incluidos en un nuevo clon de un repositorio. Esto significa que tendré que volver a realizar este paso si vuelvo a empezar con un nuevo clon, ya que los archivos .hg/.htaccess no se incluirán automáticamente en el clon, si no me equivoco. – Tex

+0

Sí, creo que tienes razón. En un nuevo clon no estaría incluido. – Aurril

0

Esto es mucho menos de una preocupación si usted acaba de mantener los depósitos fuera de su DocumentRoot en conjunto. Probablemente estés usando hgweb o hgwebdir, que no requieren que los archivos estén dentro de DocumentRoot, así que no lo hagas. Póngalos en/home/hg/repos o algo así y configure su hgwebdir.conf para buscar allí.

La única razón para tener los repositorios dentro de DocumentRoot sería habilitar el formulario URL http estático para mercurial, pero es muy lento y siempre se prefiere hgweb cuando sea posible.

Cuestiones relacionadas