RN Risus NovaDocumentación oficial
Risus Nova 2.1.5

El bootstrap en header.php

Recorrido verificado por la inicialización común, la seguridad, los servicios globales y los controles de acceso de Risus Nova.

Actualizada: 2026-07-27Autor: Equipo PHPost4 min de lectura

Función del archivo

header.php prepara el entorno común antes de ejecutar un controlador. El orden real del archivo es:

  1. Protección contra doble carga.
  2. Definición de la raíz.
  3. Carga temprana de seguridad.
  4. Cabeceras HTTP y sesión.
  5. Configuración de errores y límites.
  6. Definición de rutas internas.
  7. Carga de config.inc.php.
  8. Comprobación de instalación.
  9. Carga de funciones y clases base.
  10. Limpieza de la petición.
  11. Creación de objetos principales.
  12. Selección del tema e inicialización de Smarty.
  13. Asignación de variables globales.
  14. Lista negra, mantenimiento y suspensión.

Protección contra doble carga

php
if (defined('TS_HEADER')) return;
define('TS_HEADER', true);

La constante impide ejecutar el bootstrap más de una vez en la misma petición.

Raíz y seguridad temprana

php
define('TS_ROOT', dirname(__FILE__));
require_once TS_ROOT . '/inc/class/c.seguridad.php';

TS_ROOT sirve como base para las rutas absolutas del proyecto. La clase de seguridad se carga antes de iniciar la sesión porque se utiliza para detectar HTTPS y obtener posteriormente la IP del cliente.

Cabeceras HTTP

Mientras no se hayan enviado cabeceras, el archivo configura:

  • X-Frame-Options: SAMEORIGIN.
  • X-Content-Type-Options: nosniff.
  • X-XSS-Protection: 1; mode=block.
  • Referrer-Policy: strict-origin-when-cross-origin.
  • Permissions-Policy sin cámara, micrófono ni geolocalización.
  • HSTS durante un año cuando tsSeguridad::isHttps() devuelve verdadero.

Sesión endurecida

php
if (session_status() === PHP_SESSION_NONE) {
    session_start([
        'cookie_httponly' => true,
        'cookie_secure' => tsSeguridad::isHttps(),
        'cookie_samesite' => 'Lax',
        'use_strict_mode' => true
    ]);
}

La sesión solo se inicia si no existe otra activa. La cookie usa HttpOnly, se marca como segura bajo HTTPS, aplica SameSite=Lax y activa el modo estricto de PHP.

Errores y tiempo de ejecución

php
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED);
ini_set('display_errors', FALSE);
ini_set('log_errors', '1');
set_time_limit(300);

Los errores no se muestran al visitante, pero el registro permanece habilitado. El tiempo máximo se establece en 300 segundos.

Rutas internas

php
define('TS_CLASS', TS_ROOT . '/inc/class/');
define('TS_EXTRA', TS_ROOT . '/inc/ext/');
define('TS_FILES', TS_ROOT . '/files/');

Estas constantes centralizan las rutas de clases, extensiones y archivos.

Configuración e instalación

php
require_once TS_ROOT . '/config.inc.php';

if (isset($db['hostname']) && $db['hostname'] === 'dbhost') {
    header("Location: ./install/index.php");
    exit;
}

El marcador dbhost identifica una configuración todavía no completada y provoca la redirección al instalador.

Dependencias comunes

El bootstrap carga:

php
require_once TS_EXTRA . 'functions.php';
require_once TS_CLASS . 'c.core.php';
require_once TS_CLASS . 'c.user.php';
require_once TS_CLASS . 'c.monitor.php';
require_once TS_CLASS . 'c.actividad.php';
require_once TS_CLASS . 'c.mensajes.php';
require_once TS_CLASS . 'c.smarty.php';
require_once TS_EXTRA . 'QueryString.php';

Después ejecuta cleanRequest() antes de instanciar los servicios.

Objetos principales

php
$tsCore      = new tsCore();
$tsUser      = new tsUser();
$tsMonitor   = new tsMonitor();
$tsActividad = new tsActividad();
$tsMP        = new tsMensajes();

Estos objetos quedan disponibles para los controladores cargados posteriormente por index.php.

Tema y Smarty

php
$tsTema = $tsCore->settings['tema']['t_path'] ?? 'default';
define('TS_TEMA', $tsTema);
$smarty = new tsSmarty();

El tema procede de la configuración dinámica. Si no existe la ruta configurada, el nombre usado como respaldo es default.

Variables globales de plantilla

El bootstrap asigna en una sola operación:

  • tsConfig.
  • tsUser.
  • tsAvisos.
  • tsNots.
  • tsMPs.
  • Día y mes actuales.
  • Cumpleaños.
  • Estadísticas.
  • Usuario de la semana.
  • Token CSRF.

Estas variables están disponibles para las plantillas sin que cada controlador tenga que repetir la asignación.

Lista negra por IP

La IP se obtiene mediante:

php
$ip = tsSeguridad::getClientIp();

Después se consulta w_blacklist para entradas de tipo 1. Cuando existe coincidencia, la petición termina con Bloqueado.

Modo sin conexión

La acción actual se obtiene con la misma compatibilidad que utiliza index.php:

php
$tsAccionActual = $_GET['action'] ?? ($_GET['do'] ?? '');

El modo sin conexión se aplica cuando:

  • offline vale 1.
  • El usuario no es administrador o moderador.
  • No posee el permiso govwm.
  • La acción no es login, login-user o login-2fa.

Para una petición normal se renderiza sections/mantenimiento.tpl. Para una petición con action, se devuelve el texto Sitio en mantenimiento.

Suspensión de usuarios

Cuando is_banned está activo, el bootstrap consulta los datos mediante getUserBanned(). Una petición normal renderiza sections/suspension.tpl; una petición de acción devuelve un bloque HTML con Usuario suspendido.

Punto de salida

Si ninguna comprobación termina la ejecución, el control vuelve al archivo que incluyó header.php. En el flujo público habitual, ese archivo es index.php, que procede a seleccionar el controlador.

Relacionado

¿Te ha servido esta página?

Tu respuesta ayuda a mejorar la documentación.