HEX
Server: Apache
System: Linux info 3.0 #1337 SMP Tue Jan 01 00:00:00 CEST 2000 all GNU/Linux
User: u115237990 (7145895)
PHP: 8.3.32
Disabled: NONE
Upload Files
File: /homepages/35/d993672390/htdocs/dermiteseborrheique/includes/init.php
<?php
/**
 * init.php — Point d'entrée unique
 * À inclure en PREMIÈRE ligne de chaque page PHP :
 *
 *   define('DS_APP', true);
 *   require_once dirname(__DIR__) . '/includes/init.php';
 *
 * Charge tout dans le bon ordre : config → db → fonctions → session → langue
 */

declare(strict_types=1);

// Sécurité : vérifie que l'appel vient bien de l'application
if (!defined('DS_APP')) {
    die('Accès direct interdit.');
}

// ── 1. Configuration ──────────────────────────────────────────────────────────
require_once __DIR__ . '/config.php';

// ── 2. Base de données ────────────────────────────────────────────────────────
require_once __DIR__ . '/db.php';

// ── 3. Fonctions utilitaires ──────────────────────────────────────────────────
require_once __DIR__ . '/functions.php';

// ── 4. Authentification ───────────────────────────────────────────────────────
require_once __DIR__ . '/auth.php';

// ── 5. Mailer ─────────────────────────────────────────────────────────────────
require_once __DIR__ . '/mailer.php';

// ── 6. Session sécurisée ──────────────────────────────────────────────────────
session_start_secure();

// ── 7. Langue ─────────────────────────────────────────────────────────────────
// Priorité : paramètre GET > session > préférence user > défaut
$lang = DEFAULT_LANG;

if (!empty($_GET['lang']) && in_array($_GET['lang'], AVAILABLE_LANGS)) {
    $lang = $_GET['lang'];
    $_SESSION['lang'] = $lang;
} elseif (!empty($_SESSION['lang'])) {
    $lang = $_SESSION['lang'];
} elseif (auth_check()) {
    $user = auth_user();
    $lang = $user['lang'] ?? DEFAULT_LANG;
}

load_lang($lang);

// ── 8. En-têtes de sécurité HTTP ──────────────────────────────────────────────
// (Seulement pour les pages HTML, pas les API/JSON)
if (!defined('DS_API') && !defined('DS_NO_HEADERS')) {
    header("X-Frame-Options: DENY");
    header("X-Content-Type-Options: nosniff");
    header("X-XSS-Protection: 1; mode=block");
    header("Referrer-Policy: strict-origin-when-cross-origin");

    if (APP_ENV === 'production') {
        header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
    }
}

// ── 9. Nettoyage automatique (1% des requêtes) ────────────────────────────────
// Supprime les tokens expirés, les tentatives de connexion anciennes, etc.
if (mt_rand(1, 100) === 1) {
    try {
        // Tokens expirés
        db_execute("DELETE FROM tokens WHERE expires_at < NOW()");
        // Tentatives de connexion > 24h
        db_execute("DELETE FROM login_attempts WHERE attempted_at < DATE_SUB(NOW(), INTERVAL 24 HOUR)");
        // Cookies remember me expirés
        db_execute("DELETE FROM remember_tokens WHERE expires_at < NOW()");
    } catch (Throwable) {
        // Silencieux — nettoyage non critique
    }
}