3600, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax', ]); session_start(); // Ouverture de session (avant tout autre envoi au client!!!) Initialiser_session(); } //************************************************************************************************************ // Fonction : Initialise une session neuve, UNE fois : valeurs par défaut, paramètres de TB_Configuration, langues, // textes. Auparavant fait uniquement par index.php : une page ouverte directement (lien d'invitation // scanné sur un téléphone, favori...) utilisait des variables inexistantes (synthèse §47). // Reçoit : Rien // Retour : Rien //************************************************************************************************************ function Initialiser_session() { if (isset($_SESSION['session_initialisee'])) return; $_SESSION['acces_valide'] = false; $_SESSION['display_menu'] = false; $_SESSION['langue'] = 'FR'; // Valeur par défaut, remplacée par Langue_par_defaut de TB_Configuration $_SESSION['shipmember'] = array('Cle_primaire' => 0, 'Prenom' => "", 'Nom' => "", 'Entreprise' => "", 'Rue' => "", 'Code_postal' => "", 'Ville' => "", 'ID_Pays' => 75, 'Telephone' => "", 'Email' => "", 'Commentaires' => "", 'Niveau_acces' => 0); $_SESSION['droits_acces'] = 0; $_SESSION['bateau_shipmember'] = array(); $_SESSION['acces'] = 0; $_SESSION['modifier_texte'] = 0; Ouverture_bdd(); // Paramètres de configuration générale : $reponse = Requete_bdd('SELECT Nom, Valeur FROM TB_Configuration WHERE Validite=1', __FILE__, __LINE__); while ($donnees = Recherche_ligne_bdd($reponse)) { if ($donnees['Nom'] == "Langue_par_defaut") $_SESSION['langue'] = $donnees['Valeur']; else $_SESSION['Config__'.$donnees['Nom']] = $donnees['Valeur']; } Liberation_jeu_de_resultat_bdd($reponse); // ID des langues selon leur préfixe : $reponse = Requete_bdd('SELECT ID, Prefix FROM TB_Langues', __FILE__, __LINE__); while ($donnees = Recherche_ligne_bdd($reponse)) $_SESSION['id_langue'][$donnees['Prefix']] = $donnees['ID']; Liberation_jeu_de_resultat_bdd($reponse); Fermeture_bdd(); chargement_langue(); // Textes de la langue en cours $_SESSION['session_initialisee'] = true; } //************************************************************************************************************ // Fonction : Insertion de l'entête des pages HTML ; essentiellement la partie
. // Au passage, cette fonction étant la première appelée par chaque page (après l'ouverture // de session obligatoire pour pouvoir accéder aux variables de session), on vérifie si // l'environnement est correctement positionné. Si ce n'est pas le cas, par exemple avec // l'accès à la BDD non établi ou aucune langue sélectionnée, elle renvoit immédiatement // vers le fichier 'index.php' qui s'en chargera. // Reçoit : Rien // Retour : Rien //************************************************************************************************************ function Entete_page_html() { // Vérification à chaque ouverture de page que les variables de session sont bien initialisées (le test se fait sur quelques "échantillons" supposés représentatifs...) : if ((!isset($_SESSION['langue'])) OR (!isset($_SESSION['display_menu']))) { header('Location:index.php?origine='.basename($_SERVER['SCRIPT_FILENAME'])); exit(); } // Entête HTML : echo ''; echo ''; echo ''; echo ''; echo 'ShipHeart - Simplicity is true luxury'; echo ''; echo ''; echo ''; echo ''; echo ''; // NB (synthèse §50) : les polices Montserrat et Oswald ne sont plus chargées depuis fonts.googleapis.com - aucune // feuille de style ne les utilisait (police du système), et chaque visite transmettait l'adresse IP du visiteur à // Google (problème RGPD). // NB (synthèse §50) : Leaflet (cartographie, chargé depuis unpkg.com) et noUiSlider (curseur de dates) ne sont plus // chargés - ils servaient aux onglets du modèle CM4, retirés au §47 ; aucune page ne les utilise plus. // gestion des fichiers CSS (et de scripts spécifiques à certains fichiers) : switch(basename($_SERVER['SCRIPT_FILENAME'])) { case "administration.php" : { echo ''; break; } case "textes.php" : { echo ''; break; } case "bateaux.php" : { echo ''; break; } case "cartes.php" : { echo ''; break; } case "mentions_legales.php" : { echo ''; break; } case "shipmembers.php" : { echo ''; break; } case "uploads.php" : { echo ''; break; } case "versions.php" : { echo ''; break; } } echo ''; // CSS de Bootstrap echo ''; // CSS général, tous écrans. // NB (synthèse §50) : "max-width" (largeur de la FENÊTRE) au lieu de "max-device-width" (taille physique de l'écran, // condition dépréciée) - même effet sur un téléphone, et cohérent avec les règles "petit écran" de format.css. echo ''; // CSS pour les petits écrans (doit être placé à la fin car il override les CSS globaux) // Chargement de srcipts JS généraux : // NB (synthèse §50) : Google Charts n'est plus chargé (depuis les serveurs de Google, sur toutes les pages) - les // graphiques utilisent Chart.js, hébergé sur le VPS (vendor/chartjs) et chargé seulement par la page qui en a besoin. echo ''; echo ''; echo ''; } //************************************************************************************************************ // Fonction : Insertion de l'entête des pages avec l'affichage du bandeau de titre et les menus. // Puis affichage des messages d'erreur et d'information en les marquant de façon différenciée // selon que le menu est déployé ou non et/ou que le message d'erreur existe et/ou que le // message d'information existe. // Reçoit : Les message d'erreur et le message d'information (de plus, on retrouve le nom du fichier via les variables du serveur) // Retour : Rien //************************************************************************************************************ function Entete_page($message_erreur, $message_information) { $nom_page = basename($_SERVER['SCRIPT_FILENAME']); // Détermination de la nouvelle langue par rapport à l'actuelle : if ($_SESSION['langue'] == "FR") $new_langue = "EN"; else $new_langue = "FR"; echo '
'; //---------------------------------- // Bandeau gauche : echo '
'; // echo ' '; // echo ''; // NB (synthèse §50) : le script du menu mobile de l'ancien site (nav_bar_global, menu_mobile, img_type, portail_pro, // portail_par) a été retiré. Ces éléments n'existent plus : il provoquait une erreur JavaScript à chaque chargement de // page et à chaque clic, et redirigeait le logo vers bienvenue.php / accueil.php, pages qui n'existent plus. //-------------------------------------------------------------------------------------------- // Script d'affichage/masquage du menu : //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- // Affichage des messages d'erreur et d'info sous le menu : //-------------------------------------------------------------------------------------------- if (!PRODUCTION) $message_erreur .= "/!\ Base de données de test [".BDD_DATABASE."]
"; // else $message_erreur .= "Base de données de production [".BDD_DATABASE."]
"; if ($message_erreur != "") echo '
'.$message_erreur.'
'; if ($message_information != "") echo '
'.$message_information.'
'; } //************************************************************************************************************ // Fonction : Insertion du pied de page // Reçoit : Rien (mais on retrouve le nom du fichier via les variables du serveur) // Retour : Rien //************************************************************************************************************ function Pied_de_page() { $nom_page = basename($_SERVER['SCRIPT_FILENAME']); // echo ""; echo ''; echo '
'; echo '
'; //================================================================================== // Script JS pour pieds de page : ?>'; echo ''; } // Fin de la fonction Pied_de_page() //************************************************************************************************************ // Jeton anti-CSRF (synthèse §48) : un jeton aléatoire par session, inclus dans chaque formulaire et vérifié à chaque // requête POST - un formulaire envoyé depuis un autre site ne peut pas le connaître. Complète SameSite=Lax. //************************************************************************************************************ // Fonction : Jeton de la session (créé au premier appel). // Retour : Le jeton (64 caractères hexadécimaux) function Jeton_csrf() { if (empty($_SESSION['jeton_csrf'])) $_SESSION['jeton_csrf'] = bin2hex(random_bytes(32)); return $_SESSION['jeton_csrf']; } // Fonction : Champ caché portant le jeton, à placer dans chaque formulaire POST. // Retour : Le code HTML du champ function Champ_jeton_csrf() { return ''; } // Fonction : Vérifie le jeton reçu dans la requête POST (comparaison à temps constant). // Retour : true si le jeton est présent et correct function Jeton_csrf_valide() { return (isset($_POST['jeton_csrf']) && is_string($_POST['jeton_csrf']) && hash_equals(Jeton_csrf(), $_POST['jeton_csrf'])); }