Solucionar problemas

auto_prepend_file y auto_append_file

Revisado el · depuracion · php

auto_prepend_file y auto_append_file son dos configuraciones de PHP que permiten básicamente hacer que un fichero específico se incluya al inicio (auto_prepend_file) o final (auto_append_file) de cada ejecución.

Son dos directivas que hace años se usaban bastante pero con la arquitectura moderna de los programas ya no son necesarios (trabajando por medio de includes, requires o Composer).

No obstante siguen teniendo su cabida, un ejemplo es el plugin de seguridad de Wordpress, Wordfence el cual usa auto_prepend_file para añadir un fichero que hace de firewall, al ser el primer código que se ejecuta en cualquier acceso a Wordpress, permite realizar diferentes análisis en la petición y poder filtrarla en caso de ser sospechosa antes de que afecte a la web.

La seguridad es el caso ejemplo que vamos a poner con esta directiva, un caso habitual es el de una web hackeada, se desinfecta, reinstala y al poco tiempo vuelve a suceder, existe una vía de entrada pero no se localiza.

Los registros muestran las peticiones vía POST que lo causan, no obstante en webs como Wordpress todas pasan por el fichero index.php por lo que no se conoce que plugin es vulnerable dado que los registros no almacenan el contenido de estas peticiones.

Usando auto_prepend_file podemos añadir temporalmente un fichero para registrar metadatos y campos concretos de las peticiones. Nunca registres el cuerpo POST completo: puede contener contraseñas, cookies, tokens, datos personales o información de pago.

Paso a paso

Creamos fuera de public_html el fichero /home/CPANEL_USUARIO/private/request-debug.php con el contenido, ajustando action, plugin y event a los únicos campos necesarios para la investigación:

<?php

umask(0077);
$logFile = '/home/CPANEL_USUARIO/private/request-debug.log';
$selectedFields = [];

foreach (['action', 'plugin', 'event'] as $field) {
    if (isset($_POST[$field]) && is_scalar($_POST[$field])) {
        $selectedFields[$field] = mb_substr((string) $_POST[$field], 0, 200);
    }
}

$entry = [
    'time' => date(DATE_ATOM),
    'method' => $_SERVER['REQUEST_METHOD'] ?? null,
    'path' => parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH),
    'fields' => $selectedFields,
];

file_put_contents($logFile, json_encode($entry, JSON_UNESCAPED_SLASHES).PHP_EOL, FILE_APPEND | LOCK_EX);
chmod($logFile, 0600);

Debemos modificar CPANEL_USUARIO por nuestro usuario de cPanel.

Este script guarda solo la ruta, el método y los campos seleccionados. No añadas campos de contraseña, autorización, cookies, tokens, datos personales o pago; si un valor legítimo puede contener información sensible, redáctalo o sustitúyelo por un hash antes de registrarlo. El directorio private debe quedar fuera de la raíz web y el fichero debe pertenecer al usuario de cPanel con permisos 0600.

Tras esto en el fichero .htaccess de public_html añadimos justo al inicio:

php_value auto_prepend_file '/home/CPANEL_USUARIO/private/request-debug.php'

Nuevamente cambiamos el usuario de cPanel por el correspondiente.

El registro request-debug.log guardará únicamente los datos seleccionados para depurar el problema.

Define antes de empezar una ventana corta de captura y un tamaño máximo. Al terminar, elimina inmediatamente la línea auto_prepend_file, borra request-debug.php y destruye el registro cuando dejen de ser necesarias las evidencias. Mientras se conserve, limita su acceso al personal que realiza el análisis y aplica una retención explícita; no lo guardes indefinidamente.

También te puede ayudar

  1. Depurar errores en aplicaciones o ficheros PHP
  2. Habilitando el mostrado de errores en PHP para ficheros concretos
  3. Habilitar el mostrado de errores de PHP desde el fichero .htaccess
  4. Habilitar el mostrado y registro de errores de PHP desde cPanel