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
}
}