Comunidad de diseño web y desarrollo en internet online

Proteger carpetas con .htaccess y .htpasswd

Aprende a proteger directorios de tu página web mediante archivos .htaccess de una forma sencilla. Algunos paneles de control tienen la opción integrada, pero nunca está de más saber hacerlo manualmente. Sobre todo porque así es más extendible.

Requisitos

  • Al menos la enseñanza primaria o equivalente
  • Tener conceptos mínimos sobre .htaccess y .htpasswd y como editarlos
  • Necesidad de proteger una carpeta del alcance de los mirones, o encontrar diversión en hacerlo
  • 7 minutos de su tiempo

Conociendo a .htaccess y .htpasswd

Así se llaman los dos archivos más importantes para modificar cosas en nuestro servidor. No tienen ni extensión ni nombre, simplemente son así. Contienen texto plano, por lo que pueden ser editados con el Bloc de Notas, el Programmers Notepad, Gedit, nano, wim, ... cualquier cosa que trabajo con texto plano (Word NO) El archivo .htaccess además de para proteger carpetas, sirve entre otras cosas para utilizarlo con el mod_rewrite de Apache y nos salgan urls cortas, como la de este tutorial (Si lo estás leyendo en Cristalab). En esta ocasión, .htaccess establecerá el tipo de permiso necesario y qué usuarios pueden acceder a qué archivos, mientras que .htpasswd guardará el nombre de usuario y contraseña de cada uno de ellos.

.htaccess

Este archivo lo colocaremos en la carpeta que queremos proteger. Editemos el .htaccess con algo similar a :

AuthUserFile /ruta/absoluta/hacia/.htpasswd
AuthName AquiPuedesPonerLoQueQuieras
AuthType Basic

require user test123

Veamos línea a línea

AuthUserFile /ruta/absoluta/hacia/.htpasswd 

Le tenemos que indicar la ruta absoluta (del servidor) hacia nuestro archivo .htpasswd, por norma general el archivo de contraseñas se pone fuera del alcance de la web, es decir, fuera de la carpeta public_html o similar, como por ejemplo "/home/usuario/.htaccess". En un servidor decente y con accesso por SSH o similares es muy fácil saber cual es la ruta absoluta hacia tu web, en caso contrario puedes utilizar este pequeño php para descubrirla :

<?php
    die($_SERVER["DOCUMENT_ROOT"]);
?>

Recuerden: Dejen siempre el archivo .htpasswd fuera del alcance público, en caso de que eso no sea posible, cambienle el nombre por algo del estilo .aSf5cHJ9D. No evitarás que puedan descubrir tus usuarios y contraseñas, pero le pones el camino bastante más dificil.

AuthName AquiPuedesPonerLoQueQuieras

Muestra el nombre del sitio, te aparecerá una ventanita preguntando el nombre de usuario y contraseña con un mensaje similar a "Está intentando entrar a AquiPuedesPonerLoQueQuieras, debe especificar un nombre de usuario y contraseña". Da exactamente igual lo que pongas, no tiene un efecto sobre el nombre real de la carpeta o archivos.

AuthType Basic

Indica que el tipo de autentificación es básico.

require user test123

Indica que el único usuario que puede entrar es test123, cualquier otro -aunque la contraseña sea correcta- no será válido.
Tenemos variaciones de esa línea como por ejemplo :

require user test123 otrousuario unusuariomas

Donde especificar 2, 3 o más usuarios. Tambien tenemos :

require valid-user

Donde podrán entrar todos los usuarios especificados en el archivo .htaccess (u otro nombre si así lo indicaste en la primera línea.

Podemos incluso proteger sólo algunos archivos de la manera :

AuthUserFile /ruta/absoluta/hacia/.htpasswd
AuthName AquiPuedesPonerLoQueQuieras
AuthType Basic

<Files "miwebporno.html">
 Require valid-user
</Files>

<Files "misvideosxxx.html">
 Require user test123
</Files>

Como ven admite mucho juego.

.htpasswd

Me referiré a .htpasswd como el nombre del archivo, pero como ya dije anteriormente, si no lo pueden esconder de la vista pública, al menos cámbienle el nombre.

Este archivo contiene una lista de nombres de usuario y contraseñas, en formato usuario:contraseña y cada nombre-clave en una línea independiente, por ejemplo :

test123:12JvVkeJRgm8A
otrousuario:$1$UNHEaBiV$NzwYQ8NhjzIOUmFyfGyrO/

Como ven, la contraseña está encriptada, por lo general con una variación del algoritmo MD5 realizada por Apache. Pueden encontrar en Internet varios sitios en donde encriptar las contraseñas (este por ejemplo).

Si disponemos de un servidor apache en local o acceso SSH a nuestro servidor web, podemos ejecutar el comando htpasswd para que nos cree el archivo, o nos devuelva la cadena en la misma consola :

htpasswd -nb usuario contraseña

Esta línea imprimirá en consola la cadena a agregar (manualmente) a nuestro archivo .htpasswd

htpasswd -cb .htpasswd usuario contraseña

Esta otra escribirá en el .htpasswd la cadena corespondiente. La documentación del comando htpasswd es corta pero bastante interesante.

En cualquiera de los casos, hasta el momento hemos de añadir manualmente las parejas usuario:contraseña a nuestro archivo .htpasswd, lo cual puede ser bastante engorroso, para ello podemos utilizar PHP para modificar el contenido de ese archivo, por ejemplo un script sencillo que se limita a añadir los nombres de usuario y contraseñas :

<?php
$archivo = $_SERVER["DOCUMENT_ROOT"].'/.xAF3fvV4';
$contenido = $username.":".crypt($password);

if (is_writable($archivo)) {
 if (!$handle = fopen($archivo, 'a')) {
    echo "No se puede abrir el archivo ($archivo)";
    exit;
 }

 if (fwrite($handle, $contenido) === FALSE) {
   echo "No se puede escribir en el archivo ($archivo)";
 }
 
 
 fclose($handle);

} else {
 echo "El archivo $archivo no se puede escribir";
}
?>

Nos fijamos en dos cosas :

  • A la función fopen le pasamos el parámetros "a" de append (añadir a continuación), por lo que sólo añade nuevos usuarios.
  • Usamos la función de php crypt, en vez del MD5 que supuestamente es el algoritmo que se debe usar. La razón de usar crypt en vez de md5, es que es algo más completa, y perfecta para este ejemplo.

Enlaces de Interés

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate