Por lo tanto, está almacenando contraseñas de la base de datos y secretos criptográficos en un archivo dentro de la raíz web, posiblemente porque el alojamiento web de bajo nivel no tiene otro almacenamiento para estos secretos. Al ingresar el nombre de este archivo como ruta en una solicitud HTTP GET
, se recuperará su contenido. Incluso si no proporciona un "explorador de archivos no basado en la web", un usuario malintencionado puede terminar adivinando correctamente el nombre de este archivo de clave secreta a menos que su nombre sea criptográficamente aleatorio. O alguien que sabe el nombre del archivo puede filtrar el nombre a una parte maliciosa.
El archivo .htaccess
en el servidor HTTP Apache, o archivos análogos en otros servidores web, está diseñado para evitar el acceso directo a un archivo a través de la web incluso si un cliente conoce su nombre. Esto es útil en dos situaciones:
- Supongamos que almacena secretos en un archivo JSON que su script PHP carga con
file_get_contents()
cuando se inicia. El .htaccess
bloquearía a un usuario que ingrese la URL de este archivo JSON.
- Supongamos que almacena secretos en un script PHP que contiene asignaciones a variables globales, que su script PHP incluye con
require_once
cuando comienza. Por ejemplo, el LocalSettings.php
de MediaWiki utiliza este enfoque. Normalmente, una secuencia de comandos de configuración de variables no producirá ningún resultado. Pero he visto situaciones ocasionales en las que mod_php o el controlador CGI no se cargan accidentalmente, lo que hace que Apache, en cambio, sirva los archivos PHP como texto sin formato, incluidos sus secretos. El .htaccess
bloquearía a un usuario que ingrese la URL de este archivo PHP.
Pero tenga cuidado: .htaccess
no impide el acceso a través de un script, como si un script toma un nombre de archivo como argumento y devuelve el contenido de ese archivo. Así que asegúrese de que todos los scripts que leen archivos con nombres variables, como los scripts de servicio de imágenes, desinfecten sus rutas canonicalizándolos ( realpath()
y amigos) y luego limitándolos a un directorio específico.