Acesso prohibido a logs creados con PHP

Loguear errores y mensajes en PHP en archivo de texto con un logger

Crear un simple logger en PHP para depurar y escribir errores en archivo de texto

Depurar nuestro código de PHP es uno de los pasos más importantes de la programación. Una gran ayuda que tenemos a nuestra disposición son los logs o archivos de log.

Hoy veremos cómo escribir mensajes de error y depuración (o debug) en archivos de texto usando PHP sin usar librerías externas, únicamente funciones nativas y un poco de código al inicio de nuestro script.

Gracias a esto podremos escribir mensajes de información y también llevar un registro de errores sin mostrarlos al usuario, con fecha y hora de llamada así como el script de llamada.

Un ejemplo del log que vamos a crear (esto dependerá de tu app pero para que te des una idea) es este:

Veamos entonces cómo loguear con PHP, además de evitar mostrar los errores al usuario, asegurando nuestras aplicaciones web.

Configurar archivo de log y ocultar errores al usuario

El propósito de un error log es:

  • No mostrar mensajes de error que un atacante podría aprovechar
  • Depurar código imprimiendo mensajes al archivo
  • Atrapar todos los errores y llevar un registro de los mismos con fecha y hora así como toda la pila de errores y stack trace

Entonces nuestro archivo en donde configuramos todo eso debe quedar así:

Para usarlo simplemente hay que incluirlo en la parte superior de nuestros archivos en donde lo vamos a ocupar y, a partir de ello, cualquier error se va a ocultar al usuario y en su lugar se va a imprimir en el archivo.

Como vemos, cada día se creará un nuevo archivo y tendrá como nombre la fecha que indicará el año, mes y día. De esta manera, podemos ver los errores que han ocurrido con el paso del tiempo.

Recuerda que todos los archivos de log serán creados en la carpeta definida por RUTA_LOGS, puedes cambiarla según tus necesidades.

Explicación del logger

Los ajustes en donde llamamos a ini_set son para modificar el archivo ini de PHP y, en el orden en el que aparecen hacen lo siguiente:

  1. Ocultan los errores, es decir, no muestran el mensaje en la página web. Esto se logra poniendo display_errors en 0
  2. Indicar que sí queremos loguear los errores, poniendo log_errors en 1
  3. Guardar la ruta del archivo en donde se van a escribir los errores o mensajes configurando error_log y pasándole la ruta del fichero.

Más abajo veremos un ejemplo. Te recomiendo ver cómo trabajar con archivos en PHP.

Ejemplo de uso de logger que acabamos de crear

Podemos depurar llamando a error_log y pasándole un mensaje. En caso de que se genere un error, será impreso en el archivo.

Finalmente, si se produce una excepción no controlada, también se pondrá en el log y se le mostrará al usuario el mensaje de “Esta página no funciona”.

Para usar el logger simplemente inclúyelo en donde lo vas a usar, recomiendo incluirlo antes que todo. En mi caso queda así y hago algunas pruebas:

El script fue para probar, pero si alguna función o clase produce un error, será logueado en el archivo. De esta manera tendrás un registro de todos los movimientos que se hacen.

Te invito a ver más sobre var_export y la notación corta de los arreglos.

Sobre la seguridad

Por cierto, cabe mencionar que nunca en tu vida debes loguear contraseñas o claves de acceso en un log, es una mala práctica y una posible vulnerabilidad.

Bonus: proteger acceso a carpeta de logs

Ya lo dije hace un momento, puedes mover la carpeta de logs a un directorio no público, pero en caso de que lo dejes en el mismo, debes protegerlo y restringirlo, porque cualquier usuario podría ver la carpeta (y su contenido) desde el navegador:

Directorio de logs expuesto al público
Directorio de logs expuesto al público

Dependiendo de tu servidor puedes aplicar distintas configuraciones, en este caso lo haré con Apache. Creamos un archivo llamado .htaccess (mira cómo habilitarlo si no lo está) y su contenido es el siguiente:

Ahora cuando alguien quiere entrar a la carpeta, se muestra esto:

Acesso prohibido a logs creados con PHP
Acesso prohibido a logs creados con PHP

Mira más sobre denegar o proteger acceso a carpetas y archivos con Apache.

Y no te preocupes, tampoco se puede acceder a los archivos individuales; pero tú sí podrás verlos desde FTP o el sistema de archivos, además de que PHP podrá seguir escribiendo. En resumen, los archivos de log se restringen al público.

Conclusiones

¿Quieres leer más sobre PHP? haz click aquí.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

1 comentario en “Loguear errores y mensajes en PHP en archivo de texto con un logger”

  1. Pingback: Laravel: Loguear errores y mensajes a archivo de log con Monolog - Parzibyte's blog

Dejar un comentario