Jan 30

.htaccess y .htpasswd

Ultimamente andaba con ganas de hacer algo con PHP. Una de las tonterías que se me había ocurrido, aprovechando que estoy moviendo todas las páginas de mi web de html a PHP, es hacer un pequeño contador de visitas. Inicialmente, simplemente guardaría en base de datos el número de veces que se visualiza cada página de mi web.

Uno de los problemas que se me plantea es ¿dónde pongo el usuario y password de la base de datos de forma que esté más o menos seguro?.

En principio, poniéndolo en un fichero .php como dos variables, por ejemplo $user=’usuario” y $password=’password’ parece que es relativamente seguro. Al pedir el fichero php al servidor, este lo interpreta, con lo que en el navegador no se ve ningún resultado.

Como medida de seguridad, se me había ocurrido que se puede poner ese fichero .php con el usuario y la password en un directorio protegido. Sé desde hace tiempo que si en un directorio que forma parte del sitio web ponemos un fichero .htaccess así

Deny from all

entonces el servidor no entregará ese fichero a nadie externo al servidor. Si alguien intenta ver desde el navegador o hacer un include desde un fichero .php, el servidor le dirá que no tiene permisos.

Hay que puntualizar una cosa. Por defecto y por seguridad, la instalación de Apache no hace ni caso de estos ficheros .htaccess. Un usuario que no sepa puede con el fichero .htaccess dejar bastante desprotegido el sitio web. Para que Apache haga caso de este fichero en un directorio concreto, en el fichero de configuración de Apache debemos añadir lo siguiente

<Directory “path_local_absoluto_al_directorio” >
Options Indexes FollowSymLinks Includes
AllowOverride All
</Directory>

Donde el path_local_absoluto_al_directorio es el path desde el directorio raíz del disco duro donde tengamos la página.

Volviendo al tema de usuario y password, en CristaLab he visto otra buena solución, que es lógica y que no se me había ocurrido y posiblemente más segura. El servidor Apache no sirve páginas fuera del directorio html_public, pero tiene acceso a todos los demás directorios y ficheros del usuario en el sistema operativo. Por ello, se puede poner un fichero con la clave y password en cualquier otro directorio fuera de nuestro directorio html_public.

Finalmente, en ese artículo, también he visto otra cosa que no sabía. Aparte de el usuario y password de la base de datos, es posible proteger directorios completos de forma que sólo se tenga acceso a ellos con el navegador introduciendo un usuario y password.

Para ello, lo primero que hay que hacer es poner los usuarios en un fichero de claves que creemos. Esto se hace creando el fichero .htpasswd, con ese nombre o con cualquier otro nombre, en un directorio que esté fuera del sitio web. Para mis pruebas lo he colocado directamente en D:\ y lo he llamado .htpasswd.

Luego, hay que añadirle usuarios. Para ellos debemos usar el programa htpasswd que viene con Apache. En mi caso, está en el path D:\Aplicaciones\Apache Group\Apache2\Bin. Una vez situado ahí, desde una línea de ms-dos, escribo

htpasswd.exe D:\.htpasswd nombre_usuario

Me pide el password para ese usuario dos veces y listo, ya está creado el usuario para el servidor de Apache. Mirando el fichero .htpasswd podremos verlo, con la clave encriptada.

Luego, en el fichero .htaccess del directorio que quiero proteger pongo

AuthUserFile d:/.htpasswd
AuthName Nombre para la pagina web protegida
AuthType Basic
require user nombre_usuario

Listo. Ahora accedo con el navegador al directorio en cuestión y me pide el usuario y password. Una vez que accedo y hasta que cierre el navegador, tengo acceso a dicho directorio.

Resumiendo y volviendo a mi problema, pondré un fichero.php con nombre raro, fuera del directorio html_public, con dos variables de nombre raro que tengan el usuario y password de base de datos. Donde me haga falta, haré un include de dicho fichero. Espero que algún experto de seguridad me diga si voy mal encaminado…

2 Responses to “.htaccess y .htpasswd”

  1. x Says:

    No es cierto lo que dices sobre eso de que alguien puede incluir un fichero php tuyo desde el suyo y asi poder ver el password en texto plano… si alguien lo hace lo unico que obtiene es lo mismo que veria desde firefox, es decir, el resultado de la ejecucion del fichero .php

    Supongo que hablas de alguien que estuviese incluyendo tu php desde otro servidor en otra empresa de hosting.

    Si hablas de alguien que incluye tu php desde el mismo servidor en el que estas tu (en la misma empresa de hosting de pago) entonces la cosa cambia y ahi ya depende de que permisos tengan los ficheros .php, lo mas recomendable es hacer chmod 644 a todos los php, esto hace imposible que otro usuario en el mismo servidor (excepto root y tu, claro) pueda acceder.

    Resumiendo, que no hace falta poner nombres raros a las variables ni nada similar. Lo mas importante en cuanto a seguridad es que “register_globals” este a off.

  2. Chuidiang Says:

    Hola:

    No me he explicado bien. Me refería a que en el dominio a.com puedo hacer un fichero malo.php con include(’b.com/password.php’) y las variables user y password de b.com/password.php quedarían accesibles en mi malo.php y puedo sacarlas en el navegador con un print en malo.php. Esta posibilidad quedaría anulada con un .htaccess con “Deny from all” en ese directorio, para que no se pueda acceder a él desde el exterior.

    De todas formas, he estado haciendo unas pruebas y no parece que funcione lo del include remoto y leer las variables. Supongo que tienes razón en lo de que sólo se vería lo que se ve desde un navegador. Como ves, he corregido el post.

    Se bueno.

Leave a Reply