Una pregunta que me llegó de un amigo que viene del mundo .Net (Que parece ser un poco más organizado o estandarizado que el nuestro :).
Lo primero que deberíamos preguntarnos es de qué nos estamos queriendo proteger.
Por lo general, la posibilidad de que alguien externo a nuestra organización tenga acceso a la configuración de nuestra aplicación no parece muy tentadora… ¿por qué? Básicamente porque puede haber información sensible (Como ser contraseñas, nombres de hosts donde están las bases de datos, etc…) que podrían dar a un atacante una ventaja importante si decidiera hacernos un daño.
Una línea de defensa que tenemos es guardar estos archivos en un directorio que no sea públicamente accesible.
Si usás el webserver Apache, conocerás seguramente la directiva DocumentRoot: lo que está «a la vista» de los visitantes es exclusivamente lo que está dentro de ese directorio (O subdirectorios, según cómo esté configurado el servidor), pero (y esta es la parte interesante), no es lo único que está a la vista para un script php.
Ejemplo:
<VirtualHost *:80> ServerName my.domain.com ServerAdmin webmaster@localhost DocumentRoot /usr/share/apache2/mysite <Directory /usr/share/apache2/mysite> Options FollowSymLinks AllowOverride All </Directory> </VirtualHost>
Con esta configuración, cuando yo ingrese a la URL http://my.domain.com/index.php, el servidor me dará el HTML generado por la ejecución del archivo /usr/share/apache2/mysite/index.php.
Imaginemos que index.php tiene algo como esto:
<?php require_once '../config.php'; echo 'Hola Mundo!';
Si yo intentara entrar (desde mi browser) al archivo config.php debería escribir algo como http://my.domain.com/../config.php (Eso obviamente, sabiendo que ahí se encuentra el archivo que busco).
Si bien podría llegar a pasar que el webserver esté mal configurado y permita hacer eso, en la gran mayoría de los casos, eso simplemente será imposible (Los requests están confinados a leer archivos que están dentro del DocumentRoot).
Si estás usando un framework estándar (Symfony, CakePHP, Laravel, etc…), esto ya estará previsto (Habrá un directorio especial para almacenar los archivos de configuración, pero siempre en última instancia se va a tratar de un tema de permisos configurados a nivel de webserver).
¿Conocés alguna otra forma de proteger tus archivos de configuración? ¡Compartila en los comentarios!
- Cómo usar PHPUnit - 03/12/2024
- ¿Cómo instalar extensiones PHP en Docker? - 26/11/2024
- Cómo agregar una página de error 500 en un proyecto PHP - 31/10/2024
Para consumir información sensible otra buena idea ya para rematar el post son las variables de entorno.
Muy buena observación! Sí, efectivamente, otra forma de almacenar información sensible es usar variables de entorno.
Para ello hay un paquete muy útil: https://github.com/vlucas/phpdotenv